Casting删除了Swift中所有级别的Optional?

时间:2018-04-14 15:22:08

标签: swift casting optional

我们都知道您可以使用可选绑定来解包一个可选项:

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 ???????'的强制演员表只打开选项;你的意思是使用'!!!!!!!'。

1 个答案:

答案 0 :(得分:0)

这是因为在结构if let unwrapped = instance as? Type中,首先评估正确的部分。完整的订单是

  1. Swift尝试通过执行Type将实例强制转换为instance as? Typeas?运算符始终执行以下操作 - 如果instance可以表示为Type,则会对其进行转换,否则返回nil。重要的是,as? Type运算符始终返回Optional<Type>,无论instance的类型如何。

  2. if let运算符始终只展开一个级别,将此Optional<Type>解包为Type