考虑一个定义多个初始化器的协议,除了一个在协议扩展中实现的协议外。
对于此示例,Xcode不会显示任何错误或警告,但尝试构建它会失败并显示Command /.../swiftc failed with exit code 1
。将其作为脚本运行会导致段错误。
protocol MyProtocol {
var values: [Int] { get }
init(_ values: Int...)
init(_ values: [Int])
init(_ values: Int..., offset: Int)
init(_ values: [Int], offset: Int)
}
extension MyProtocol {
init(_ values: Int...) {
self.init(values)
}
init(_ values: [Int]) {
self.init(values, offset: values.reduce(0) { $0 + $1 } / values.count)
}
init(_ values: Int..., offset: Int) {
self.init(values, offset: offset)
}
}
struct MyStruct: MyProtocol {
let values: [Int]
init(_ values: [Int], offset: Int) {
self.values = values.map { $0 - offset }
}
}
let myStruct = MyStruct([1, 2, 3])
我意识到只有最后一个init
(由结构本身实现的那个)应该真正成为协议的一部分(并且它以这种方式工作正常)但是它想要了解究竟是什么原因导致的如果包含它们,编译器会爆炸吗?
答案 0 :(得分:0)
没有必要在协议中声明三个具有默认实现的初始化程序,您可以删除它们,一切都按预期工作:
protocol MyProtocol {
var values: [Int] { get }
init(_ values: [Int], offset: Int)
}