我们都知道您可以使用可选绑定来解包一个可选项:
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 ???????'的强制演员表只打开选项;你的意思是使用'!!!!!!!'。
答案 0 :(得分:0)
这是因为在结构if let unwrapped = instance as? Type
中,首先评估正确的部分。完整的订单是
Swift尝试通过执行Type
将实例强制转换为instance as? Type
。 as?
运算符始终执行以下操作 - 如果instance
可以表示为Type
,则会对其进行转换,否则返回nil
。重要的是,as? Type
运算符始终返回Optional<Type>
,无论instance
的类型如何。
if let
运算符始终只展开一个级别,将此Optional<Type>
解包为Type
。