[英]Storing generic objects in Swift Array
寫了下面的小測試:
class Model { }
class SubModel : Model {}
class Collection<T: Model> {}
let collection = Collection<SubModel>()
var collections = [Collection]() // Also tried [Collection<Model>]()
collections.append(collection)
編譯器在追加調用時失敗。 消息是:'SubModel'與'Model'不同。 根據我在泛型中使用的所有其他語言的經驗,這應該有效。 作為類型SubMode的集合應該始終可以強制到Model類型的集合。 有人碰到這個嗎? 解決方法?
發生這種情況是因為Swift不支持泛型類型參數的協方差 。
例如:
class Animal {}
class Cat : Animal {}
Cat
顯然是Animal
的亞型。 但是,這並不意味着,例如, Array<Cat>
是Array<Animal>
的子類型。 在支持泛型類型參數(例如C#)的協方差的語言中, Array<Cat>
將是Array<Animal>
的子類型。
在您的特定示例中,您可以使用協議和非泛型 Collection類來解決此限制。 其他情況可能需要更多創造力。
protocol Collectible {}
class Model : Collectible {}
class SubModel : Model {}
class Collection {
func append(element: Collectible) {
// blah
}
}
var collection = Collection()
collection.append(Model())
collection.append(SubModel())
var collections = [collection]
實際上,在你的情況下,你可以讓Collection
的元素成為一個Model
,即func append(element: Model)
,但我這樣做是為了強調協議有時可以用於解決協方差限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.