簡體   English   中英

在Swift數組中存儲通用對象

[英]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.

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