【发布时间】:2016-05-20 17:02:58
【问题描述】:
协方差如何在 Swift 中为 Optionals 工作?
假设我写了以下代码:
var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)
nativeOptionalView = nativeOptionalButton
它编译和工作得很好。但是,如果我将 MyOptional 定义为
enum MyOptional<T> {
case Some(T)
case None
}
然后写下:
var myOptionalView: MyOptional<UIView>
let button = UIButton()
myOptionalView = .Some(button)
var myOptionalButton = MyOptional.Some(button)
myOptionalView = myOptionalButton
我得到错误:
错误:无法将类型“
MyOptional<UIButton>”的值分配给类型“MyOptional<UIView>”
我理解为什么 MyOptional 会出现此错误,但我不明白为什么 Optional 不会出现此错误。
【问题讨论】:
-
我怀疑答案是“编译器魔法”。
-
我很害怕 :/ 在那种情况下,考虑到它是开源的,那么神奇在哪里?
-
不确定;代码库很大。起点:github.com/apple/swift/…
-
如果您有兴趣了解它,您可能想在 swift-dev 邮件列表中提出这个问题。
-
我怀疑这与数组协方差发生的幕后魔术相同,即将
Array<UIButton>分配给Array<UIView>——这些似乎是泛型不变性的例外。跨度>
标签: swift optional covariance