Swift中的if let语句和as?,为什么要使用问号?

3
我可以理解这个语句,但是由于它很容易转换成任何类型,所以为什么后面要加上一个问号呢?
if let foo = object as? String 

这真的让我很纠结。它是指对象是可选的,还是变量"foo"的返回值是一个可选的字符串类型?还是仅仅意味着语言语法上的一种表达形式?它肯定有意义,否则为什么要在首位加上它?在if let语句中,问号后面的单词是什么意思?
我搜索了一下,但是没有找到答案。
我感到困惑,因为我知道object已经是可选的,并且被赋给了变量foo,然后if let会尝试去解包它,如果可以的话,就执行以下语句。
所以,在as?类型转换之后,if let的解包过程是发生在哪里?在从示例中转换为可选字符串之后,if let解开的是它而不是分配给该变量的可选对象类。

5
我会尽力进行翻译。以下是您需要翻译的内容:奇怪,当我搜索时我立刻就找到了:https://developer.apple.com/swift/blog/?id=23 - Dave Newton
2
请阅读 Swift编程语言:类型转换 章节中的 Downcasting 部分。 - vadian
非常感谢您的回答。我已经阅读并学习了。请回答我在帖子中最后编辑的问题。谢谢。 - newfucprogrammer
@DaveNewton - 你的链接是指向一个关于as!as?的博客文章,只是在类比中提到了as?。你可能想链接到一个关于as?的博客文章吗? - CRD
1个回答

9

您的代码:

if let foo = object as? String

分为两个重要部分:object as? Stringif let
第一个是向下转型,允许产生一个可选类型(这里是 String?),以便处理“失败”。从《The Swift Programming Language (Swift 3.1): Typecasting》中得知:

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

第二个部分是if let,它是一个“可选绑定”,用于解包可选项。只有在要解包的可选项值不是nil时才会执行if let块,并且被绑定到解包后的值。详见《The Swift Programming Language (Swift 3.1): Basics》中的“Optional Binding”。
因此,你的感觉这里发生了两次操作是正确的。 as?的转换可能失败并产生一个nil可选值,if let将检测该可选值是否为nil。我们只能希望编译器处理if letas?的组合,不会实际创建和销毁不必要的可选项。

1
嘿,感谢你没有当面嘲笑他,以及其他新手。 - user798719

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接