嵌套在协议扩展中

时间:2015-11-08 20:24:31

标签: swift initialization protocols

考虑一个定义多个初始化器的协议,除了一个在协议扩展中实现的协议外。

对于此示例,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(由结构本身实现的那个)应该真正成为协议的一部分(并且它以这种方式工作正常)但是它想要了解究竟是什么原因导致的如果包含它们,编译器会爆炸吗?

1 个答案:

答案 0 :(得分:0)

没有必要在协议中声明三个具有默认实现的初始化程序,您可以删除它们,一切都按预期工作:

protocol MyProtocol {
    var values: [Int] { get }

    init(_ values: [Int], offset: Int)
}