我想将自定义Swift容器类型强制转换或分配给“兼容”的已声明变量容器类型,例如本机Swift 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本机数组类型如何支持:
let array3: Array<HasHeading> = array1
我与包含的类型没有任何关系。
这是自动桥接的一种形式吗?

最佳答案

您正在寻找的称为通用协方差,不幸的是,Swift不支持它。编译器针​​对一小类类型的魔术硬编码协方差,例如标准库集合和Optional<T>

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

关于arrays - Swift Array如何支持有效的Element子类型分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56999134/

10-16 03:55