必须指定Swift协议中的初始化程序。为什么会这样?

时间:2014-11-12 12:33:41

标签: swift compiler-errors initialization protocols

如果您尝试在包含protocol的Swift中创建convenience initialiser,您将立即被编译器骂:

protocol Zizo{
    convenience init(a:String, b:Int)
}
  

非类型中不允许使用便捷初始化程序。

这种限制有什么理由吗?这对我来说没有意义。

可能出现什么问题?

2 个答案:

答案 0 :(得分:7)

这是因为,没有任何意义。 protocol仅定义实现者具有所需的方法和属性。它没有定义实现细节。当protocol需要init(a:String, b:Int)时,您可以根据需要将其实现为指定或便捷初始值设定项。

protocol Zizo{
    init(a:String, b:Int)
}

class Foo:Zizo {
    init() {
    }
    convenience required init(a:String, b:Int) {
        self.init()
    }
}
class Bar:Foo {
    override convenience init() {
        self.init(a:"baz", b:42)
    }
    required init(a:String, b:Int) {
        super.init()
    }
}

正如您所看到的,protocol强制init(a:String, b:Int)成为 required 初始值设定项,但对"便利性"或"指定"。

答案 1 :(得分:0)

如果您仍然喜欢这样做,您可以考虑在协议中添加一个静态函数:

protocol Zizo {
     static func make(withA a: String, b: Int) -> Self
}

当在类继承树中使用时,这确实有点毛茸茸。