我可以理解这个陈述,但是因为它足以构建任何类型,为什么会跟着一个问号:
if let foo = object as? String
这真让我烦恼。是指对象是可选的还是变量foo
的返回值是可选的字符串类型?或者它真的不仅仅意味着语言语法?它必须意味着什么,否则为什么它在第一位?这是什么意思? if let
语句中的单词后面的问号。
我搜索过,无法找到。
我很困惑当然我知道object
已经是可选的并被分配给变量foo
然后if let
解包它,如果它可以解包,或跳出以下语句。
所以在if let
类型转换后,as?
展开程序正在发生吗?在as?
从示例中转换可选字符串之后,if let
将解包而不是分配给变量的可选对象类。
答案 0 :(得分:4)
您的代码:
if let foo = object as? String
分为两个重要部分:object as? String
和if 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
的可选值。我们只能希望编译器一起处理nil
和if let
的组合,并且实现不会实际创建和销毁不必要的选项。
HTH