Swift 协议扩展中的嵌套init
考虑一个协议,它定义了多个初始值设定项,除了一个之外,所有初始值设定项都在协议扩展中实现 对于本例,Xcode未显示任何错误或警告,但尝试生成它失败,原因是Swift 协议扩展中的嵌套init,swift,initialization,protocols,Swift,Initialization,Protocols,考虑一个协议,它定义了多个初始值设定项,除了一个之外,所有初始值设定项都在协议扩展中实现 对于本例,Xcode未显示任何错误或警告,但尝试生成它失败,原因是命令/../swiftc失败,退出代码为1。将其作为脚本运行会导致segfault protocol MyProtocol { var values: [Int] { get } init(_ values: Int...) init(_ values: [Int]) init(_ values: Int..
命令/../swiftc失败,退出代码为1
。将其作为脚本运行会导致segfault
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
(由结构本身实现的那一个)才应该是协议的一部分(这样就可以很好地工作)但它想了解,如果包含编译器,究竟是什么导致编译器爆炸?协议中不需要声明三个默认实现的初始值设定项,您只需删除它们,一切都会正常工作:
protocol MyProtocol {
var values: [Int] { get }
init(_ values: [Int], offset: Int)
}
协议中不需要声明三个具有默认实现的初始值设定项,您只需删除它们,一切都可以按预期工作:
protocol MyProtocol {
var values: [Int] { get }
init(_ values: [Int], offset: Int)
}
任何问题“编译器为什么崩溃”的答案都是“编译器错误”。无论输入是什么,编译器都不应该崩溃。任何时候你可以使编译器崩溃,你应该提交一个雷达(bugreport.apple.com)。任何问题“编译器为什么会崩溃”的答案总是“编译器错误”。编译器永远不应该崩溃,不管输入是什么。任何时候你可以使编译器崩溃,你应该提交一个雷达(bugreport.apple.com)。