【发布时间】:2018-09-24 18:13:04
【问题描述】:
我们都知道你可以使用可选绑定来解开一个可选的:
let b: String? = "bye"
if let greeting = b {
print(greeting) // "bye"
}
但如果该值有多个级别的可选项,则只会删除一个:
let b: String?? = "bye"
if let greeting = b {
print(greeting) // "Optional(bye)"
}
将值转换为基础类型将删除双重可选:
let b: String?? = "bye"
if let greeting = b as? String {
print(greeting) // "bye"
}
我惊讶地发现这适用于任何级别的选项:
let b: String??????? = "bye"
print(b as Any) // Optional(Optional(Optional(Optional(Optional(Optional(Optional("bye")))))))
if let greeting = b as? String {
print(greeting) // "bye"
}
是否解释了为什么强制转换会删除所有级别的选项?
还有:
let b: String??????? = "bye"
print(b as! String) // "bye"
但它给出了幽默的警告:
从 'String???????' 强制转换仅解开选项;你的意思是使用'!!!!!!!'。
【问题讨论】:
-
是使用 Foundation 导入还是纯 Swift?
-
@Sulthan,纯 Swift 具有相同的行为。
-
您考虑过在forums.swift.org/c/swift-users 上提问吗?
-
Swift 的运行时强制转换机制可以查看可选值以(递归地)对有效负载值执行强制转换(实际上是 the very first thing it tries to do)。
-
基本上它已融入语言。如果您考虑一下,铸造 Optional 根本不应该是合法的,但它得到了一个特殊的幕后授权来允许它。我不喜欢语法糖,Swift 值得注意的是要避免它,但 Optionals 的强制转换无疑是一个很好的例子。