为什么Swift的可选绑定在某些情况下会以'nil'成功?

时间:2014-10-26 18:22:56

标签: if-statement swift optional

Apple的Swift language documentation可选绑定(又名if let)将“检查里面的值可选”和“将该值提取为“变量或常量”。但这与我所看到的不符。例如

var x: Int? = nil

if let y1: Int? = x {
    println("y1 = \(y1)") // This is printed, suggesting that x is not checked "inside", but left as Optional(nil) (!= nil)
}

if let y2: Int? = x? {
    println("y2 = \(y2)")
}

if let y3: Int = x? {
    println("y3 = \(y3)")
}

if let y4: Int = x {
    println("y4 = \(y4)")
}

if let y5 = x? {
    println("y5 = \(y5)")
}

if let y6 = x {
    println("y6 = \(y6)")
}

结果(仅)

"y1 = nil"

建议在x案例中没有检查y1的“内部”(并且x被保留为包裹的nil,这是不相等的解开nil)。 y2案例似乎通过强制“检查内部”(或者只是可选链接“接管”)来证实这一点;但是故事必须有更多内容,因为y4y6案例也不会打印,因此表现得好像正在“检查内部”。

我怀疑尝试

可以获得一些洞察力
"x = 42"

导致

"y1 = Optional(42)"
"y2 = Optional(42)"
"y3 = 42"
"y4 = 42"
"y5 = 42"
"y6 = 42"

但如果那里有三个,那就输给我了。

似乎(1)如果要求明确检查(?),表达式右侧的“可选”确实会“在里面检查”;但除此之外(2)表达式的左侧影响检查执行的“内部”程度(足以进行有效分配)。

在这些情况下,可选绑定如何工作?特别是,当x == nil为什么y1打印时,如果确实如此,为什么不y4y6(或生成分配错误)?

2 个答案:

答案 0 :(得分:2)

我的解释不同:

var x: Int? = 1

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//prints y = 1, the optional was checked, contains a value and passes it

var x: Int? = nil

if let y1: Int = x {
    println("y1 = \(y1)") 
}

//does not execute because x does not contain value that can be passed to a non optional y

var x: Int? = nil

if let y1: Int? = x {
    println("y1 = \(y1)")
}
// y = nil, since y is optional and can hold a value of x which is nil, then it passes nil

可选绑定用于检查可选项是否包含要传递给非可选参数的值。

答案 1 :(得分:1)

您为可选的Int指定了可选的Int。任务确实成功了。无论可选的Int是否包含Int,它总是会成功。