swift如果让声明为?,但为什么要使用问号?

时间:2017-05-21 17:45:28

标签: swift syntax

我可以理解这个陈述,但是因为它足以构建任何类型,为什么会跟着一个问号:

if let foo = object as? String 

这真让我烦恼。是指对象是可选的还是变量foo的返回值是可选的字符串类型?或者它真的不仅仅意味着语言语法?它必须意味着什么,否则为什么它在第一位?这是什么意思? if let语句中的单词后面的问号。

我搜索过,无法找到。

我很困惑当然我知道object已经是可选的并被分配给变量foo然后if let解包它,如果它可以解包,或跳出以下语句。

所以在if let类型转换后,as?展开程序正在发生吗?在as?从示例中转换可选字符串之后,if let将解包而不是分配给变量的可选对象类。

1 个答案:

答案 0 :(得分:4)

您的代码:

if let foo = object as? String

分为两个重要部分:object as? Stringif let

第一种是通过生成可选类型(String?来实现失败的向下转发)。来自The Swift Programming Language (Swift 3.1): Typecasting

  

当您不确定向下转换是否成功时,请使用类型转换运算符(as?)的条件形式。这种形式的运算符将始终返回一个可选值,如果无法进行向下转换,则该值将为nil。这使您可以检查成功的向下转发。

第二个if let是一个可选绑定,它解包一个可选项,if let的主体仅在被解包的可选值不是{{}时执行。 1}}并将绑定变量绑定到未包装的值。请参阅 Swift编程语言(Swift 3.1)中的Optional Binding:基础知识

所以你感觉某事正在发生两次这是正确的。 nil强制转换可能会失败并产生as?可选值,nil会测试if let的可选值。我们只能希望编译器一起处理nilif let的组合,并且实现不会实际创建和销毁不必要的选项。

HTH