作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
var z1 = false
var z2 = false
var z3 = false
if let y1: Int = nil {
z1 = true
}
if let y2: Int? = nil {
z2 = true
}
var x: Int? = nil
if let y3: Int? = x {
z3 = true
}
println(z1) // false
println(z2) // ture
println(z3) // false
我尝试像这样使用可选值(我知道这很奇怪,我只是对深度的可选值感到好奇)。
结果并不如我所料。 z1 是假的,这是我所期望的,但为什么 z2 是真的?赋值后y2为nil,但是if语句认为这个表达式(let y2: Int? = nil
)为真,执行下一条语句(z2=true
),为什么会这样?
为什么 z2 不是假的?
如果 y2 只是声明为一个可选值,它可以包含另一个可选值,可选值可能为 nil,if let
语句只是检测解包成功,那么,为什么 z3 不正确?
最佳答案
这是因为您可以将可选变量声明为递归可选的,如下所示:
var x: Int?? = 5
// LLDB: p x.dynamicType returns (Int??)
你可以走得更远:
var y: Int????????? = 6
// LLDB: p x.dynamicType returns (Int?????????)
if let
构造的作用是检查您是否可以解包一个可选值,即使它的最终值为 nil
,您也可以解包 optional 可选值.把它想象成可选值不是 nil
本身,它是一些包装 nil
的对象。
要在代码中检查它,您可以执行以下操作:
var a: Int? = nil;
// LLDB: p a! returns fatal error: Can't unwrap Optional.None
var b: Int?? = nil;
// LLDB: p b! returns (Int?) $R2 = nil
所以这就是您的 z2
条件发生的情况:if let
构造正在检查它是否可以打开 y2
并且它是,所以执行了 if block 。
关于swift - swift 中奇怪的可选值用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24053246/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!