我有一个关于Swift中泛型的快速问题。问题是我试图存储一个以泛型为参数的变量,但是无法将其强制转换为它所限制的类型。最好在一个简短的示例中进行解释:
class Foo { }
class Thing<T: Foo> {
func produceBar() -> Bar {
return Bar(aThing: self as! Thing<Foo>)
}
}
class Bar {
var thing: Thing<Foo>
init(var aThing: Thing<Foo>) {
self.thing = aThing
}
}
上面的代码产生错误:
"Cast from Thing<T> to unrelated type Thing<Foo> always fails"
因为T被限制为Foo的子类,它不应该永远不会失败吗?我一定会误解泛型在Swift中的工作方式,任何指导或帮助将不胜感激!
最佳答案
Swift泛型不是协变的。这就是错误的确切含义:即使Basket<Apple>
是Basket<Fruit>
的类型,您也不能自动说Apple
是Fruit
的一种。这有充分的理由。
考虑以下代码:
class Fruit {}
class Apple: Fruit {}
class Orange: Fruit {}
class Basket<T: Fruit> {
private var items: [T]
func add(item: T) {
items.append(item)
}
init() {}
}
func addItem<T: Fruit>(var basket: Basket<T>, item: T) {
basket.add(item)
}
let basket:Basket<Apple> = Basket()
addItem(basket as Basket<Fruit>, Orange())
如果将
Basket<Apple>
视为Basket<Fruit>
,这将是合法代码,并且允许我在一篮子苹果中添加橙色。