簡體   English   中英

通用參數受其他通用參數約束

[英]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()
    }
}

我希望這能正常工作。 我定義了TCHILD應該是T的子類。 但是,Swift編譯器不同意並在init<CHILD: T>的行上顯示以下錯誤。

從非協議,非類類型“ T”繼承

我也在不同的場景中嘗試了通用參數繼承。 在類中添加以下方法(並刪除導致編譯錯誤的init)。

func to<OTHER where OTHER: AnyObject, T: OTHER>() {

}

這產生基本上相同的輸出。

類型“ T”限制為非協議類型“ OTHER”

我雖然可能無法進行任何操作,但以類似的錯誤消息結束。 這是Swift中的錯誤嗎? 還是我錯過了什么? 還是它是Swift的功能,並且將永遠無法按照我的想法工作?

如果要傳遞任何TAnyObject類型的Factory<T> ,則只需編寫:

init(childFactory: Factory<T>) {
    factoryClosure = { () -> T in
        return otherFactory.create()
    }
}

因為T會自動受到您的班級的約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM