2016-09-26 24 views
6

有沒有之間的任何功能上的差異:多重讓保護陳述與單一讓步一樣嗎?

guard let foo = bar, let qux = taco else { 
    ... 
} 

和:

guard let foo = bar, qux = taco else { 
    ... 
} 

在我看來,它們是相同的和額外的let不需要?

+4

第二個變種在Swift 2中是允許的,但不是已經在Swift 3中了。 –

回答

9

這些都是在斯威夫特3.不同在這種情況下:

guard let foo = bar, let qux = taco else { 

你說「可選,不折酒吧到foo中。如果成功,可選擇將玉米麪包解開成qux,如果成功繼續,則...「

另一方面:

guard let foo = bar, qux = taco else { 

說「可選 - 解包到foo中。作爲一個布爾值,評估assignement聲明qux = taco「自賦值語句不返回布爾斯威夫特,這是一個語法錯誤。

這一改變使更加靈活guard語句,因爲你可以在整個鏈混雜可選的解包和布爾。在Swift 2.2中,你必須解開所有東西,然後在where子句的末尾進行所有的布爾檢查(有時使其無法表達條件)。

+0

好的,很高興知道。顯然我還在swift 2上。我有一個linter抱怨第一個語法,當我們升級時需要改變。 KS! –

+0

如果你使用Swift 2.3,Xcode 8本身會週期性地顯示一個錯誤,然後在編譯器做出的最後一遍中消失。 – PeejWeej

6

沒有它在Swift 3.0中不再一樣。 Xcode給你一個錯誤,並要求你在應用多個變量時添加let

enter image description here

所以,你應該用

guard let foo = bar, let qux = taco else { 
    ... 
}