2014-10-26 59 views
2

蘋果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的情況似乎通過強制「檢查內部」(或只是可選鏈接「接管」)來證實這一點;但由於y4y6案件也不打印,因此在故事中必須有更多內容,因此表現得好像正在發生「內部檢查」一樣。

我懷疑是有一些有識之士從試圖

"x = 42" 

導致

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

來獲得,但如果三個的一些在那裏,它失去了我。 (1)如果需要明確的檢查(使用?),表達式右邊的「可選」確實會得到「檢查內部」(?);但除此之外(2)表達式的左側影響執行檢查的「內部」的程度(僅足夠進行有效的分配)。

在每種情況下,可選綁定是如何工作的?特別是當x == nil爲什麼y1打印,並給出它的確如此,爲什麼不y4y6(或生成分配錯誤)?

回答

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 

可選的結合是檢查是否可選包含的值傳遞給非可選參數。

+0

所以它是這樣的:右側首先檢查「可選鏈」(這是第一個'y2','y3'和'y5'結束的地方)。那麼,如果這不是「無」,那麼如果可以進行有效的分配,那麼事情就會進行。這很簡單嗎? – orome 2014-10-26 18:40:41

+0

是的,如果沿鏈的任何地方,它是零,綁定將失敗。如果你需要知道綁定失敗的地方,這裏有一個很好的討論:http://stackoverflow.com/questions/26524246/how-to-know-where-optional-chaining-is-breaking – 2014-10-26 18:44:33

+0

所以:在案例' y2','y3'和'y5'可選*鏈接*命中'nil'並且事情結束。在'y4'和'y6'的情況下,檢查'x'裏面的內容,找到'nil'(並且不能指定給非可選項),這樣事情就結束了。但是我仍然對'y1'發生了什麼事情感到困惑:似乎沒有「check inside」在這裏發生。如果有的話,事情就會失敗(例如'如果讓y1:Int?= nil {...}'失敗)。這似乎是「檢查裏面」發生*必要的,以獲得工作分配*。 – orome 2014-10-26 18:59:31

1

您爲可選的Int分配了一個可選的Int。任務確實成功了。無論可選的Int是否包含Int,它都會成功。

+0

所以在這種情況下('y1')沒有發生「內部檢查」。這種檢查似乎只有在需要使分配工作時纔會真正發生(情況'y4'和'y6',正如'x'不是''nil'時所顯示的那樣)。對? – orome 2014-10-26 19:05:10

+0

這裏的癥結(對我來說)是爲什麼讓y1:Int? = nil {...}'的行爲與'let y1:Int不同? = x {...}'其中'x'是'nil'。 (請參閱[其他答案](http://stackoverflow.com/a/26576451/656912)上的討論)。 – orome 2014-10-26 20:54:06

相關問題