【问题标题】:How does Swift Array support valid Element subtype assignment?Swift Array 如何支持有效的 Element 子类型赋值?
【发布时间】:2019-11-21 18:13:11
【问题描述】:

我想将自定义 Swift 容器类型转换或分配给“兼容”声明的变量容器类型,如原生 Swift Array 支持。下面的代码是已识别问题的完整示例。 Array 支持,我的自定义结构不支持。

我已经检查了 Swift.Collection.Array 的接口,并开始检查源代码。不知何故 Array 支持下面的行: let array3: Array<HasHeading> = array2 而我的自定义类型 ThingContainer 不支持相同的语义 let things3: ThingContainer<HasHeading> = things1

protocol HasHeading {
    var heading: Double { get }
}

struct Heading: HasHeading {
    let heading: Double
}

let heading1 = Heading(heading: 89.0)
let heading2 = Heading(heading: 90.0)


struct ThingContainer<T> {
    let thingOne: T
    let thingTwo: T

    init(thingOne: T, thingTwo: T) {
        self.thingOne = thingOne
        self.thingTwo = thingTwo
    }
}

let things1: ThingContainer<Heading> = ThingContainer(thingOne: heading1,
                                                      thingTwo: heading2)

let things2: ThingContainer<HasHeading> = ThingContainer(thingOne: heading1,
                                                         thingTwo: heading2)
//error: cannot convert value of type 'ThingContainer<Heading>' to specified type 'ThingContainer<HasHeading>'
let things3: ThingContainer<HasHeading> = things1
let things4: ThingContainer<HasHeading> = things2

let array1: Array<Heading> = [heading1,heading2]

let array2: Array<HasHeading> = [heading1,heading2]

let array3: Array<HasHeading> = array1
let array4: Array<HasHeading> = array2

Swift 原生 Array 类型如何支持: let array3: Array&lt;HasHeading&gt; = array1 我与包含的类型没有任何关系。 这是一种自动桥接形式吗?

【问题讨论】:

标签: arrays swift generics casting containers


【解决方案1】:

您正在寻找的东西称为泛型协方差,不幸的是,Swift 不支持它。编译器魔术硬编码一小组类型的协方差,例如标准库集合和Optional&lt;T&gt;

有关该主题的更多信息,我建议阅读Friday Q&A 2015-11-20: Covariance and Contravariance by Mike Ash

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多