2015-11-30 70 views
-4

我用斯威夫特2和Xcode的7防護運轉斯威夫特2

我想知道像一個if聲明

if condition { ... } else { ... } 

guard ... else ... 
+2

[Swift 2 guard關鍵字]的可能重複(http://stackoverflow.com/q/30791488/4151918) –

回答

4

真正的大的區別是,當你正在做的一個可選的綁定:

if let x = xOptional { 
    if let y = yOptional { 
     // ... and now x and y are in scope, _nested_ 
    } 
} 

進行對比:

guard let x = xOptional else {return} 
guard let y = yOptional else {return} 
// ... and now x and y are in scope _at top level_ 

出於這個原因,我經常有多重繼承之前guard報表,我得到到例行公事。

+0

請參閱我的書進一步討論:http://www.apeth.com/swiftBook/ch05。 html#SECguard – matt

+0

下面是一個實用的代碼示例:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/80551757899141e786b7f601f3879a7b450923c2/bk2ch02p070filters2/ch15p419filters/MyVignetteFilter.swift – matt

+0

另一個(我的代碼充滿了這種類型):https://github.com/mattneub/Programming-iOS-Book-Examples/blob/80551757899141e786b7f601f3879a7b450923c2/bk2ch14p653backgroundPlayerAndInterrupter/interrupter/interrupter/AppDelegate.swift – matt

2

之間的差異,guard執行語句基於表達式的Boolean值。與if語句不同,guard語句僅在條件未滿足時才運行。你可以想像看起來更像是一個Assert,但不是崩潰,你可以優雅地退出。

參考和代碼示例here

0

爲了增加Matt's answer,您可以在單個保護聲明幾個條件:

guard let x = xOptional, y = yOptional else { return } 
// ... and now x and y are in scope _at top level_ 

除了可選的綁定,監護條件可以測試布爾結果:

guard x > 0 else { return } 

總之,守護語句的好處是在範圍的開始處使早期退出顯而易見,而不是將條件隱藏在嵌套else語句中。