【发布时间】: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<HasHeading> = array1
我与包含的类型没有任何关系。
这是一种自动桥接形式吗?
【问题讨论】:
-
试试
let things3: ThingContainer<HasHeading> = ThingContainer(thingOne: things1.thingOne, thingTwo: things1.thingTwo) -
查看我的书apeth.com/swiftBook/ch04.html#_explicit_specialization 并向下滚动到“泛型不是协变的”框。数组可以做到这一点,但你不能。 :(
标签: arrays swift generics casting containers