可选协方差如何在Swift

时间:2016-05-20 17:02:59

标签: swift optional covariance

协方差如何在Swift中用于Optional

说我写下面的代码:

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

我收到错误:

  

错误:无法指定类型&#39; MyOptional<UIButton>&#39;的值输入&#39; MyOptional<UIView>&#39;

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

2 个答案:

答案 0 :(得分:6)

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

Swift类型检查器是每个表达式,而不是全局的(如在Haskell中)。此任务是handled by lib/Sema中的语义分析。约束系统然后尝试match the types,然后处理collectionsoptionals的特殊协方差情况。

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

答案 1 :(得分:0)

虽然我同意可能会有一些“编译魔术”,但这可以通过将按钮强制转换为UIView来实现,例如。

var myOptionalButton = MyOptional.Some(button as UIView)

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