【问题标题】:Initializers in protocols in Swift must be designated. Why is that so?必须指定 Swift 协议中的初始化程序。为什么呢?
【发布时间】:2015-01-09 07:32:30
【问题描述】:
如果你尝试在 Swift 中创建一个包含convenience initialiser 的protocol,你会立即被编译器骂:
protocol Zizo{
convenience init(a:String, b:Int)
}
非类类型中不允许使用便利初始化器。
这个限制有什么原因吗?这对我来说没有意义。
可能会出什么问题?
【问题讨论】:
标签:
swift
compiler-errors
initialization
protocols
【解决方案1】:
如果您仍然想这样做,您可以考虑在协议中放置一个静态函数:
protocol Zizo {
static func make(withA a: String, b: Int) -> Self
}
当在类继承树中使用时,这确实有点麻烦。
【解决方案2】:
这是因为,它没有任何意义。 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 初始化程序,但对“方便”或“指定”没有任何作用。