实现在协议扩展中返回的静态协议函数时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()
为 return P
,以及在错误行替换Self
为P
,会导致编译成功,但是会丢失类型精度(并且需要在每个调用站点强制向下转换,并Self
详细记录要求)。
对于此问题,是否还有其他不丢失通用返回类型的解决方法?
编辑:补偿缺乏上下文的更多细节:P
是一个公共协议,将由库公开,以符合(和覆盖)各种类型,g()
因此覆盖不是一种选择。最好不必更改为协议扩展以外的其他内容,因为库内部在许多地方都使用了它。鉴于这两个选项,更改 to 的返回类型是更好的选择。f()
NSData
f()
f()
P
更新
从 Swift 4(可能是 3)开始,上面的代码按原样工作。