swift if let 语句使用 as?,但为什么要使用问号?

new*_*mer 2 syntax swift

我可以理解该语句,但由于足以强制转换任何类型,为什么后面跟着一个问号,例如:

if let foo = object as? String 
Run Code Online (Sandbox Code Playgroud)

真是烦死我了。这是否意味着对象是可选的,或者变量的返回值foo是一个可选的字符串类型?或者它真的只是一种语言语法没有任何意义?它一定意味着什么,否则为什么它首先存在?这是什么意思?if let语句中单词后的问号。

我搜索过,没有找到。

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

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

CRD*_*CRD 7

您的代码:

if let foo = object as? String
Run Code Online (Sandbox Code Playgroud)

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

第一个是向下转型,它通过生成可选类型(此处)来允许失败String?。来自Swift 编程语言 (Swift 3.1):类型转换

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

第二个, if let, 是一个可选绑定,它解开一个可选值,if let只有在解包的可选值没有nil并且绑定变量绑定到解包值时,才会执行的主体。请参阅Swift Programming Language (Swift 3.1): BasicsOptional Binding

所以你认为这里发生了两次是正确的。转换as?可能会失败并产生一个nil可选值,if let将测试该可选值nil。我们只能希望编译器处理 和 的组合,if let并且as?实现实际上不会创建和销毁不必要的选项。

HTH