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

时间:2014-10-26 22:22:46

标签: swift initialization initializer

我定义了一个简单的类:

class MyClass {
    var name:String?

    required init() {
        println("init")
    }
}

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

extension MyClass {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

一切正常。

我在协议中定义新的初始值设定项时:

protocol MyProtocol {
    init(name:String)
}

让我的分机确认该协议:

extension MyClass : MyProtocol {
    convenience init(name: String) {
        self.init()
        self.name = name
    }
}

我收到以下错误:

  

初始化程序要求&#init;(名称:)'只能满足一个   非最终类' MyClass'

定义中的required初始值设定项

这里发生了什么?

(顺便说一句:我不能使我的班级final,因为这只是一个更复杂的用例的摘录。)

1 个答案:

答案 0 :(得分:22)

好的,我的坏。

为了保证所有子类符合MyProtocol,新的初始值设定项也必须标记为required

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

extension MyClass : MyProtocol {
    required convenience init(name: String) {
        self.init()
        self.name = name
    }
}