【发布时间】:2015-12-15 13:01:32
【问题描述】:
在协议扩展中实现返回Self的静态协议函数时,在扩展中函数的实现出现错误(没有上下文显示的最小简化场景):
import Foundation
protocol P {
static func f() -> Self
static func g() -> Self
}
extension P {
static func f() -> Self { // Method 'f()' in non-final class 'NSData' must return `Self` to conform to protocol 'P'
return g()
}
}
extension NSData: P {
static func g() -> Self {
return self.init()
}
}
在发生错误的行上将Self 替换为P 会导致编译器出现段错误(sig 11)(这似乎是传达类型不匹配错误的有效方式)。
将f() 的声明更改为返回P,以及在错误行将Self 替换为P,会导致编译成功,但是会丢失类型精度(并且需要在每个调用站点强制向下转换,并详细记录Self 的要求)。
对于此问题是否有任何其他不丢失通用返回类型的解决方法?
编辑:弥补上下文不足的更多细节:P 是一个公共协议,将由库公开,以符合各种类型(并覆盖 g()),所以在NSData 中覆盖f() 不是一种选择。最好不必将f() 更改为协议扩展以外的其他内容,因为库内部在许多地方都使用了它。鉴于这两个选项,将f() 的返回类型更改为P 是更好的选择。
更新
从 Swift 4(可能是 3)开始,上述代码按原样运行。
【问题讨论】:
-
“导致编译器出现段错误(sig 11)(这似乎是传达类型不匹配错误的有效方式)。”请务必向 Apple 报告。
标签: swift interface swift2 protocol-extension