Swift Generics&Upcasting

Cha*_*had 7 generics ios swift

我对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
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码产生错误: "Cast from Thing<T> to unrelated type Thing<Foo> always fails"

不应该永远不会失败,因为T被限制为Foo的子类?我一定是误解了Swift中泛型的工作方式,任何指导或帮助都会非常感激!

Rob*_*ier 10

Swift泛型不是协变的.也就是说,确切地说错误是什么:你不能自动说a 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())
Run Code Online (Sandbox Code Playgroud)

如果Basket<Apple>被认为是a Basket<Fruit>,这将是合法代码,并且我将被允许在一篮子苹果中添加橙子.