苹果Swift language documentation说可选结合(又名if let
)将“检查值内一个可选的”和“提取物该值装入”一个变量或常量)。但这与我所看到的不符。例如为什么Swift的可选绑定在某些情况下以'nil'成功?
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
的情况似乎通过强制“检查内部”(或只是可选链接“接管”)来证实这一点;但由于y4
和y6
案件也不打印,因此在故事中必须有更多内容,因此表现得好像正在发生“内部检查”一样。
我怀疑是有一些有识之士从试图
"x = 42"
导致
"y1 = Optional(42)"
"y2 = Optional(42)"
"y3 = 42"
"y4 = 42"
"y5 = 42"
"y6 = 42"
来获得,但如果三个的一些在那里,它失去了我。 (1)如果需要明确的检查(使用?
),表达式右边的“可选”确实会得到“检查内部”(?
);但除此之外(2)表达式的左侧影响执行检查的“内部”的程度(仅足够进行有效的分配)。
在每种情况下,可选绑定是如何工作的?特别是当x == nil
为什么y1
打印,并给出它的确如此,为什么不y4
和y6
(或生成分配错误)?
所以它是这样的:右侧首先检查“可选链”(这是第一个'y2','y3'和'y5'结束的地方)。那么,如果这不是“无”,那么如果可以进行有效的分配,那么事情就会进行。这很简单吗? – orome 2014-10-26 18:40:41
是的,如果沿链的任何地方,它是零,绑定将失败。如果你需要知道绑定失败的地方,这里有一个很好的讨论:http://stackoverflow.com/questions/26524246/how-to-know-where-optional-chaining-is-breaking – 2014-10-26 18:44:33
所以:在案例' y2','y3'和'y5'可选*链接*命中'nil'并且事情结束。在'y4'和'y6'的情况下,检查'x'里面的内容,找到'nil'(并且不能指定给非可选项),这样事情就结束了。但是我仍然对'y1'发生了什么事情感到困惑:似乎没有“check inside”在这里发生。如果有的话,事情就会失败(例如'如果让y1:Int?= nil {...}'失败)。这似乎是“检查里面”发生*必要的,以获得工作分配*。 – orome 2014-10-26 18:59:31