如何忽略泛型类型信息并启用属性的协方差?

时间:2016-11-06 02:36:26

标签: ios swift generics

即。

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时代的动态类型转换?

1 个答案:

答案 0 :(得分:0)

var children = [Child<**ANY subclass of UIView, for example**>]

那不是很好吗?但是算了吧。您创建的泛型在参数化类型上协变,您无能为力。在泛型的地方,多态性不是。

你可能反对:但看看可选!看看Array!是的,看看他们。他们从Apple获得了某种特殊的安排。即使从Objective-C导入的泛型也可能是协变的。但不是你的泛型。

但是,您可以使用 type erasure 创建一个不同参数化的Child对象数组。但是,这与参数化类型的继承无关。这只是一种允许多个子结构进入一个数组的方法。