我有一个关于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"
"Cast from Thing<T> to unrelated type Thing<Foo> always fails"
因为T被限制为Foo的子类,它 不 应该 永远不会 失败吗?我一定会误解泛型在Swift中的工作方式,任何指导或帮助将不胜感激!
Swift泛型不是协变的。就是说,错误确切说明了什么:即使是,您也无法自动说出a Basket<Apple>是一种。这有充分的理由。Basket<Fruit>``Apple``Fruit
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>,这将是合法代码,并且允许我向一篮子苹果中添加橙子。
Basket<Fruit>