Swift通用转换错误

时间:2018-07-19 02:25:22

标签: swift generics

代码如下:

class Animall<T> {
    var value: T?
}

protocol Type {
    var name: String {get set}
}


class Duck: Type {
    var name = "duck"
}

var d = Animall<Duck>()
var duck = Duck()
duck.name = "duck"
d.value = duck

if let finalD = d as? Animall<Type> {
    print(finalD.value?.name)
}
else {
    print("Can't Convert")
}

始终记录“无法转换”。我想知道原因。我很困惑 鸭是符合类型协议。为什么不转换!

1 个答案:

答案 0 :(得分:0)

Animal<Duck>不是Animal<Type>的“子类”,即使Duck符合协议Type。它们是不同的类,这是由于Swift泛型类型相对于其泛型参数而言是不变的。这意味着每次您使用不同类型引用Animal时,无论继承如何,Animal“实例”实际上都是不同的,不兼容的类型。

您可以通过将处理代码移至在Type上运行的通用函数来解决此“限制”:

func doSomething<T: Type>(with animal: Animal<T>) {
    print(animal.value?.name)
}

doSomething(with: d)