【问题标题】:swift if let statement with as?,but why use question mark?swift if let 语句用 as?,但为什么要使用问号?
【发布时间】:2017-05-21 17:45:28
【问题描述】:

我可以理解该语句,但是对于转换任何类型都足够好,为什么后面跟一个问号,例如:

if let foo = object as? String 

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

我搜索了,没有找到。

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

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

【问题讨论】:

标签: swift syntax


【解决方案1】:

您的代码:

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 的主体仅在被解包的可选值不是nil 并且带有绑定变量被绑定到展开的值。请参阅 Swift 编程语言 (Swift 3.1):基础 中的 Optional Binding

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

HTH

【讨论】:

  • 嘿,谢谢你没有当着他的面笑,并由此延伸到其他新手
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2018-09-16
  • 1970-01-01
  • 2018-03-25
  • 2019-02-13
  • 2017-01-27
  • 2021-04-02
相关资源
最近更新 更多