蘋果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