代码如下:
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")
}
始终记录“无法转换”。我想知道原因。我很困惑 鸭是符合类型协议。为什么不转换!
答案 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)