Génériques Swift & Upcasting

J'ai une petite question sur les generics dans Swift. Le problème est que j'essaie de stocker une variable qui prend un générique en paramètre, mais que je suis incapable de le convertir au type dont il est limité. C'est mieux expliqué dans un court exemple:

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 } } 

Le code ci-dessus produit l'erreur: "Cast from Thing<T> to unrelated type Thing<Foo> always fails"

Ne devrait-il jamais échouer, puisque T est restreint à être une sous-class de Foo? Je dois me méprendre sur la façon dont les generics fonctionnent dans Swift, toute aide ou orientation serait très appréciée!

Les generics Swift ne sont pas covariants. C'est-à-dire, exactement ce que l'erreur dit: vous ne pouvez pas dire automatiquement qu'un Basket<Apple> est une sorte de Basket<Fruit> même si Apple est une sorte de Fruit . Il y a de bonnes raisons pour cela.

Considérez le code suivant:

 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()) 

Ce serait un code légal si le Basket<Apple> était considéré comme un Basket<Fruit> , et que je serais autorisé à append une orange à un panier de pommes.