繁体   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