Swift - Generic无法附加到超类数组

时间:2017-03-06 07:14:55

标签: swift

好的,这就是问题所在:

说我们有一个包含ChildClasses数组的父类

class ParentClass {

    var list: [ChildClass<UITableViewCell>] = []

    func append<T>(cell: T) where T: UITableViewCell {
        let child = ChildClass<T>()
        list.append(child)
    }

}

和子类

class ChildClass<T> where T: UITableViewCell {

    var obj: T!

}

这两个类都是通用的,Type(T)总是类型为UITableViewCell

现在如果您尝试构建它,您将收到此错误:

  

无法转换ChildClass类型的值&lt; T>预期参数类型ChildClass&lt; UITableViewCell&gt;

但是如果T是UITableViewCell的子类,那么它是不是能够转换T ??? 提前谢谢

2 个答案:

答案 0 :(得分:1)

ChildClass<T>不是ChildClass<UITableViewCell>的子类,即使TUITableViewCell的子类。

我的回答提供了一个例子,说明如果建立了这样的协方差可能会出现什么问题:https://stackoverflow.com/a/42615736/3141234

答案 1 :(得分:1)

Swift对泛型非常严格。 ChildClass<UITableViewCell>ChildClass<SomeSubclassOfUITableViewCell>不兼容。

一种解决方法是将ChildClass<SomeSubclassOfUITableViewCell>转换为ChildClass<UITableViewCell>,因为从逻辑上讲,它们应该兼容。我还注意到你没有使用cell参数,所以这可能就是你想要的方法:

func append<T>(cell: T) where T: UITableViewCell {
    let child = ChildClass<UITableViewCell>()
    child.obj = cell
    list.append(child)
}