swift if let statement with as?,但为什么要用问号?

标签 swift syntax

我能理解该语句,但足以转换任何类型,为什么后跟一个问号,如:

if let foo = object as? String 

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

我搜索了一下,没找到。

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

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

最佳答案

您的代码:

if let foo = object as? String

分为两个重要部分:object as?字符串if let

第一个是向下转换,它通过生成一个可选类型(此处为 String?)来允许失败。来自 The Swift Programming Language (Swift 3.1): Typecasting :

Use the conditional form of the type cast operator (as?) when you are not sure if the downcast will succeed. This form of the operator will always return an optional value, and the value will be nil if the downcast was not possible. This enables you to check for a successful downcast.

第二个,if let,是一个可选的绑定(bind),它解开一个可选的,if let的主体只有在展开的可选值不是 nil 并且绑定(bind)变量绑定(bind)到展开的值。参见 Optional Binding Swift 编程语言(Swift 3.1):基础

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

HTH

关于swift if let statement with as?,但为什么要用问号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099956/

相关文章:

iOS FBSDKLogin 按钮文本淡入

ios - 跳过(同时 :) call against a Signal in ReactiveSwift is being ignored

c++ - 带有尾随返回类型的 final、override、const 的语法

html - Wget 将我的 URL 地址的某些部分识别为语法错误

JavaScript 语法 : AngularJS Filter

ios - 我的 navBarItem 出现问题

ios - 如何在 Swift 中使用包含 URL 的函数

ios - 更新后结构崩溃 : [Fabric isCrashlyticsCollectionEnabled]: unrecognized selector sent to class 0x10c0bb918

php - 这包括路径语法的含义

Python:采用三个参数的部分