Swiftgenerics和向上转换

在Swift中,我有一个关于generics的简单问题。 问题是我试图存储一个variables,需要generics作为参数,但无法将其强制转换为受限制的types。 最好用一个简短的例子来解释:

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中的generics工作方式,任何指导或帮助将不胜感激!

Swiftgenerics不是协变的。 也就是说,错误所说的是:即使Apple是一种Fruit也不能自动地说一个Basket<Apple>是一种Basket<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> ,那么这将是合法的代码,我可以在一篮苹果中添加一个桔子。