ios - Swift 泛型和向上转型

标签 ios swift generics

我有一个关于 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"

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

最佳答案

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> ,我将被允许在一篮子苹果中添加一个橙子。

关于ios - Swift 泛型和向上转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487258/

相关文章:

ios - 使用 Swift 动画约束更改(第二项)?

ios - UIView.label 上的 Swift/IBAction/CGRect

ios - 是否可以在“设置”->“iCloud”->“文档和数据”中拦截 iCloud 打开/关闭?

ios - 如何过滤 'updateSearchResultsForSearchController' 中的字典数组以使用 Swift 搜索 UITableView

swift - 尽管启用了后台位置更新,但 CLLocationManager 委托(delegate)在应用程序暂停后未收到位置更新

java - 在java中传递泛型类类型

Java 泛型 - 方法参数

iphone - 连接 nsstring 并排除空值

ios - Parse iOS 有多少次相同的条目?

java - Java 泛型中的删除