即。
struct Child<Type> {
var item: Type
}
class Parent {
var children = [Child<**ANY subclass of UIView, for example**>]()
}
所以,如果我有
let one = Child(item: UIView())
let two = Child(item: UITableView())
我想要
let parent = Parent()
parent.children += [one,two]
如果您使用Parent
键入children
班级的[Child<UIView>]
媒体资源,它只会接受Child
类型的UIView
而不是协变类型(即{{ 1}}。)
我需要处理一个可以包含UIView的任何子类的泛型类型,但是UITableView
类甚至不关心这个属性,它只触及Parent
的其他非泛型属性类。
有没有这样做不需要Objective-C时代的动态类型转换?
答案 0 :(得分:0)
var children = [Child<**ANY subclass of UIView, for example**>]
那不是很好吗?但是算了吧。您创建的泛型在参数化类型上不协变,您无能为力。在泛型的地方,多态性不是。
你可能反对:但看看可选!看看Array!是的,看看他们。他们从Apple获得了某种特殊的安排。即使从Objective-C导入的泛型也可能是协变的。但不是你的泛型。
但是,您可以使用 type erasure 创建一个不同参数化的Child对象数组。但是,这与参数化类型的继承无关。这只是一种允许多个子结构进入一个数组的方法。