首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift数组如何支持有效的元素子类型分配?

Swift数组如何支持有效的元素子类型分配?
EN

Stack Overflow用户
提问于 2019-07-12 09:29:04
回答 1查看 37关注 0票数 0

我想将一个自定义的Swift容器类型转换或赋值给一个“兼容的”声明的变量容器类型,就像原生Swift数组支持的那样。下面的代码是一个识别了问题的完整示例。数组支持它,而我的自定义结构不支持。

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

代码语言:javascript
复制
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我不能与包含的类型有任何关系。这是自动桥接的一种形式吗?

EN

回答 1

Stack Overflow用户

发布于 2019-07-12 10:59:39

您正在寻找的是通用协方差,不幸的是,Swift不支持它。编译器为一小部分类型提供了强大的硬编码协方差,比如标准库集合和Optional<T>

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56999134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档