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