Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift如果让语句使用as?,为什么要使用问号?_Swift_Syntax - Fatal编程技术网

swift如果让语句使用as?,为什么要使用问号?

swift如果让语句使用as?,为什么要使用问号?,swift,syntax,Swift,Syntax,我能理解这句话,但既然这句话足以表达任何类型的意思,为什么后面会有一个问号,如: if let foo = object as? String 我真的很烦。这是指对象是可选的还是变量foo的返回值是可选的字符串类型?或者它真的什么都没有,只是一种语言语法?它一定意味着什么,否则它为什么会在那里?这是什么意思?单词后面的问号,如if let语句中的问号 我搜索过了,但没有找到 我很困惑,因为我知道对象已经是可选的,并且被分配给变量foo然后如果让它展开,如果它可以展开,或者跳出下面的语句 因此

我能理解这句话,但既然这句话足以表达任何类型的意思,为什么后面会有一个问号,如:

if let foo = object as? String 
我真的很烦。这是指对象是可选的还是变量
foo
的返回值是可选的字符串类型?或者它真的什么都没有,只是一种语言语法?它一定意味着什么,否则它为什么会在那里?这是什么意思?单词后面的问号,如
if let
语句中的问号

我搜索过了,但没有找到

我很困惑,因为我知道
对象
已经是可选的,并且被分配给变量
foo
然后
如果让它
展开,如果它可以展开,或者跳出下面的语句

因此,
if let
展开过程在
as之后进行?
类型转换对吗?
as?
从示例中铸造一个可选字符串后,如果let正在展开该变量的非可选对象类。

您的代码:

if let foo = object as? String
分为两个重要部分:
对象为?字符串
如果让

第一种是向下转换,它通过生成可选类型(
String?
此处)来允许失败。发件人:

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

第二个,
if let
,是一个可选绑定,它打开一个可选绑定,只有当要打开的可选值不是
nil
并且绑定的变量绑定到打开的值时,
if let
的主体才会执行。请参见Swift编程语言(Swift 3.1):基础

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


HTH

奇怪,我在搜索时立即发现:请阅读“向下看”部分,非常感谢您的回答。我读书和学习。请回答我文章中最后一个编辑过的问题。@DaveNewton-您的链接是指向
as
as?
只是在类比中提到的。你是否打算链接到
上的一篇博客文章作为?
?嘿,谢谢你没有当面嘲笑他,也谢谢其他新手