Swift Generics&上溯造型

时间:2015-05-27 15:46:49

标签: ios swift generics

我对Swift中的泛型有一个快速的问题。问题是我试图存储一个将泛型作为参数的变量,但是无法将其强制转换为受其限制的类型。最好用简短的例子解释一下:

F

上面的代码会产生错误: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 } }

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

1 个答案:

答案 0 :(得分:8)

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>,这将是合法代码,并且我可以将橙色添加到一篮子苹果中。