當在協議擴展中實現返回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