如果您尝试在包含protocol
的Swift中创建convenience initialiser
,您将立即被编译器骂:
protocol Zizo{
convenience init(a:String, b:Int)
}
非类型中不允许使用便捷初始化程序。
这种限制有什么理由吗?这对我来说没有意义。
可能出现什么问题?
答案 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
}
当在类继承树中使用时,这确实有点毛茸茸。