可选协方差如何在Swift中工作

fpg*_*503 12 covariance optional swift

协方差如何Optional在Swift中运行?

说我写下面的代码:

var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)

nativeOptionalView = nativeOptionalButton
Run Code Online (Sandbox Code Playgroud)

它编译和工作得很好.但是,如果我定义MyOptional

enum MyOptional<T> {
    case Some(T)
    case None
}
Run Code Online (Sandbox Code Playgroud)

并写下以下内容:

var myOptionalView: MyOptional<UIView>
let button = UIButton()
myOptionalView = .Some(button)
var myOptionalButton = MyOptional.Some(button)

myOptionalView = myOptionalButton
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误:无法指定类型' MyOptional<UIButton>'的值来键入' MyOptional<UIView>'

我理解为什么会出现这种错误MyOptional,我不明白为什么它不会发生Optional.

fpg*_*503 7

它没有.Swift目前不支持自定义协变泛型.

Swift类型检查器是每个表达式,而不是全局的(如在Haskell中).此任务lib/Sema中的语义分析处理.然后约束系统尝试匹配类型,然后处理集合选项的协方差的特殊情况.

这是一个语言设计决定.您应该能够使用内置的集合类型和选项执行所需的一切.如果你不是,你应该开雷达.