[英]Generic parameter constrained by other generic parameter
由於Swift缺乏協方差,我需要一些解決方法。 我來自Java世界,因此我本能地嘗試創建從一種類型到另一種通用類型的約束。
所以我寫了下面的課:
class Factory<T: AnyObject> {
let factoryClosure: () -> T
init(closure: () -> T) {
factoryClosure = closure
}
init<CHILD: T>(childFactory: Factory<CHILD>) {
factoryClosure = { () -> T in
return otherFactory.create()
}
}
func create() -> T {
return factoryClosure()
}
}
我希望這能正常工作。 我定義了T
, CHILD
應該是T
的子類。 但是,Swift編譯器不同意並在init<CHILD: T>
的行上顯示以下錯誤。
從非協議,非類類型“ T”繼承
我也在不同的場景中嘗試了通用參數繼承。 在類中添加以下方法(並刪除導致編譯錯誤的init)。
func to<OTHER where OTHER: AnyObject, T: OTHER>() {
}
這產生基本上相同的輸出。
類型“ T”限制為非協議類型“ OTHER”
我雖然可能無法進行任何操作,但以類似的錯誤消息結束。 這是Swift中的錯誤嗎? 還是我錯過了什么? 還是它是Swift的功能,並且將永遠無法按照我的想法工作?
如果要傳遞任何T
為AnyObject
類型的Factory<T>
,則只需編寫:
init(childFactory: Factory<T>) {
factoryClosure = { () -> T in
return otherFactory.create()
}
}
因為T會自動受到您的班級的約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.