如何满足包含初始化程序的协议?

Kla*_*aas 29 initialization initializer swift

我定义了一个简单的类:

class MyClass {
    var name:String?

    required init() {
        println("init")
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在这样的扩展中添加一个新的初始化程序:

extension MyClass {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常.

但是只要我在协议中定义新的初始化程序:

protocol MyProtocol {
    init(name:String)
}
Run Code Online (Sandbox Code Playgroud)

并让我的扩展确认该协议:

extension MyClass : MyProtocol {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

初始化程序要求'init(name :)'只能通过required非final类'MyClass'定义中的初始化程序来满足

这里发生了什么?

(顺便说一句:我不能上课final,因为这只是一个更复杂的用例的摘录.)

Kla*_*aas 24

好的,我的坏.

为了保证所有符合MyProtocol新初始化程序的子类都必须标记为required.

此外,Swift要求在类中直接声明所有必需的初始值设定项,并且不允许在扩展中声明它们.

extension MyClass : MyProtocol {
    required convenience init(name: String) {
        self.init()
        self.name = name
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它对我不起作用:必需的初始化程序必须直接在类“MyClass”中声明 (10认同)
  • 我不明白.你会在修复后显示你的代码吗? (3认同)
  • 我遵循了这个答案并获得了“所需的便利”初始化程序。哇。 (3认同)
  • 我同意:只要我将我的扩展名复制粘贴到班级本身,一切都会奏效. (2认同)