簡體   English   中英

swift 中從泛型類派生的類的限制

[英]Limitation with classes derived from generic classes in swift

我試圖從泛型類派生我的類:

class foo<T> {}
class bar : foo<Int> {}

但是此代碼無法編譯並出現錯誤:

從泛型類派生的類也必須是泛型的

如何避免這種限制? 是否可以?

斯雷格,

不幸的是,這是官方的

您可以對泛型類進行子類化,但子類也必須是泛型類。

讓我們希望 Apple 在未來的版本中修復這個問題。

同時,讓我們將此視為利用聚合而不是子類化的機會。

筆記:

作為解決方案的窮人版本,可以使用typealias

class foo<T> {}
class bar<Int> : foo<Int> {}
typealias Bar = bar<Int>

這樣,其余的代碼就可以像 Apple 已經解決了這個問題一樣編寫。

我遇到了同樣的問題,我找到了解決方案!

class SomeType {
}
class Foo<T> {
}
class Bar<T: SomeType>: Foo<T> {
}

現在你可以這樣做:

let bar = Bar()

這將默認 Bar 的類型為 SomeType。 唯一的缺點是您只能對“可子類化”類型執行此操作。 所以對於Int這將不起作用。

在 Swift 2 中,可以對泛型類進行子類化:

class Something {}

class Base<T> {}

class Fancy : Base<Something> {}

typealias解決方案的替代方案是從字面上typealias文檔:

您可以對泛型類進行子類化,但子類也必須是泛型類。

因此,我們將子類設為泛型類,但屬於不用於任何用途的另一種類型。

class foo<T> {

    func doSomething(t:T) -> T {
        return t;
    }
}

class bar<S> : foo<Int> {

    override func doSomething(t:Int) -> Int {
        return t * t;
    }
}

let b : bar = bar<AnyObject>()
b.doSomething(5) // 25 instead of 5

我更喜歡這種使用typealias方法,因為它不會用額外的類型污染命名空間。 如果子類 ( bar ) 是publicinternal這一點尤其重要。

編輯

該文檔不再包含有關泛型子類限制的短語。 希望這意味着蘋果計划早日改變這一點。

現在正式支持:

class Foo<RelatedType> {
    var object: RelatedType? = nil

    func myFunction(param: RelatedType) -> RelatedType? {
        return nil
    }
}

class Bar: Foo<String> {
    override func myFunction(param: String) -> String? {
        return self.object
    }
}

暫無
暫無

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

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