协方差如何发挥作用Optional
是 Swift 吗?
假设我写了下面的代码:
var nativeOptionalView: Optional<UIView>
let button = UIButton()
nativeOptionalView = .Some(button)
var nativeOptionalButton = Optional.Some(button)
nativeOptionalView = nativeOptionalButton
它编译并运行得很好。但是如果我定义MyOptional
as
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
.
事实并非如此。 Swift 目前不支持自定义协变泛型。
Swift 类型检查器是针对每个表达式的,而不是全局的(如 Haskell 中)。这个任务是处理者 https://swift.org/compiler-stdlib/#compiler-architecture中的语义分析lib/Sema https://github.com/apple/swift/tree/master/lib/Sema。然后约束系统尝试匹配类型 https://github.com/apple/swift/blob/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/lib/Sema/CSSimplify.cpp#L1152然后处理协方差的特殊情况收藏品 https://github.com/apple/swift/blob/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/lib/Sema/CSSimplify.cpp#L1674, and 选项 https://github.com/apple/swift/blob/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/lib/Sema/CSSimplify.cpp#L1925.
这是一个语言设计决定。您应该能够使用内置集合类型和选项完成您需要的一切。如果你不是,你可能应该打开雷达。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)