当在协议扩展中实现返回Self
的静态协议函数时,扩展中的函数实现时会出现错误(最小简化方案显示为无上下文):非最终类中的方法必须返回`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
,以及对错误行与P
更换Self
,导致编译成功,但失去式精密(并要求部队在每次调用点向下转型,加上记录在Self
要求详情)。
是否有任何其他解决此问题的方法不会失去通用返回类型?
EDIT:进一步的细节,以补偿缺少的上下文:P
是一个公共协议,它由库被暴露,用于各种类型的,以符合(并重写g()
),f()
在NSData
所以压倒一切的不是一个选项。最好不要将f()
更改为协议扩展以外的内容,因为它在很多地方被库内部使用。鉴于这两种选择,将f()
的返回类型更改为P
是更好的选择。
“导致编译器出现segfault(sig 11)(这似乎是传达类型不匹配错误的有效方式)”。请确保您向Apple报告。 – JeremyP