[英]Limitation with classes derived from generic classes in swift
我試圖從泛型類派生我的類:
class foo<T> {}
class bar : foo<Int> {}
但是此代碼無法編譯並出現錯誤:
從泛型類派生的類也必須是泛型的
如何避免這種限制? 是否可以?
我遇到了同樣的問題,我找到了解決方案!
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
) 是public
或internal
這一點尤其重要。
編輯
該文檔不再包含有關泛型子類限制的短語。 希望這意味着蘋果計划早日改變這一點。
現在正式支持:
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.