Swift 协议扩展中的嵌套init

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..

考虑一个协议,它定义了多个初始值设定项,除了一个之外,所有初始值设定项都在协议扩展中实现

对于本例,Xcode未显示任何错误或警告,但尝试生成它失败,原因是
命令/../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)。