协方差如何在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
不会发生这种错误。
答案 0 :(得分:6)
没有。 Swift目前不支持自定义协变泛型。
Swift类型检查器是每个表达式,而不是全局的(如在Haskell中)。此任务是handled by lib/Sema中的语义分析。约束系统然后尝试match the types,然后处理collections和optionals的特殊协方差情况。
这是一项语言设计决定。您应该能够使用内置的集合类型和选项执行所需的一切。如果你不是,你应该打开雷达。
答案 1 :(得分:0)
虽然我同意可能会有一些“编译魔术”,但这可以通过将按钮强制转换为UIView来实现,例如。
var myOptionalButton = MyOptional.Some(button as UIView)
或
var myOptionalButton: MyOptional<UIView> = .Some(button)