在本文中,您將學習使用Guard語句來控制程序執(zhí)行的流程。
Swift If 語句描述了如何基于特定條件(布爾值)執(zhí)行操作。在本文中,我們將學習 guard 語句優(yōu)于 if 語句的優(yōu)點,以控制程序流,并編寫更簡單和干凈的代碼。
Guard語句語句的主要用途是在一定條件下將程序控制轉移到某個范圍之外。這些語句與基于特定條件(布爾值)執(zhí)行語句的if語句類似,但與if不同,guard語句只在不滿足某些條件時運行。
此外, guard 語句必須從范圍中退出。因此,我們必須在 guard 語句的末尾使用用戶程序控制語句return、break、continue或throw。
guard expression else { //語句 //必須包含一個控制語句: return、 break、 continue 或 throw。 }
這里 expression是一個布爾表達式(返回true或false)。
如果 expression 值計算為false,則執(zhí)行代碼塊內的 guard 語句。
如果 expression 值計算為 true,則代碼塊內的 guard 語句將從執(zhí)行中跳過。
注意:guard語句的結束必須包含一個控制語句 return,break,continue 或 throw。
一個簡單的有效guard 語句如下:
guard true else { print("條件不滿足") } print("滿足條件")
運行該程序時,輸出為:
滿足條件
在上述程序中,guard 包含一個布爾值true(滿足條件)。由于guard語句僅在不滿足條件時運行,因此不會執(zhí)行 guard內的語句。這就是為什么執(zhí)行 print("滿足條件") 并在屏幕上輸出滿足條件的原因。
現在,將條件更改為 false:
guard false else { print("條件不滿足") } print("滿足條件")
在上述程序中,保護條件的計算結果為false。所以,應該執(zhí)行else中的print("Condition not met")語句。但是您將收到一個錯誤消息:'guard' body may not fall through, consider using a 'return' or 'throw' to exit the scope.
錯誤消息意味著,您需要使用return、break、continue或throw語句從guard語句轉移程序控制?,F在我們將使用return。由于return語句只能在函數內部使用,所以我們將把上面的代碼包裝在Swift函數中。
我們可以在Swift的函數中使用guard語句,如下所示:
func someFunction() { guard false else { print("條件不滿足") return } print("滿足條件") } someFunction() print("函數調用后輸出 Hello")
當您運行上述程序時,輸出將是:
條件不滿足 函數調用后輸出 Hello
在上述程序中,guard 條件的計算結果為 false,因此執(zhí)行guard 內部的語句。第一條語句print("條件不滿足")在控制臺中輸出:條件不滿足。
并且語句 return 終止函數的執(zhí)行,同時 print("Hello, after function call") 函數調用執(zhí)行后的語句在控制臺中輸出:函數調用后輸出 Hello。
我們在Swift Optionals中已經看到使用 if-let 來解開一個 Optional。但是,我們也可以使用guard語句代替if-let來展開可選語句,這有一個好處。使用guard而不是if-let展開可選變量的主要優(yōu)點是,我們可以增加解包變量的作用域。
讓我們在下面的示例中看到這一點:
func changeOptionalStringToUpperCase() { var name:String? guard let temp = name else { print("名稱為nil。 無法處理") return } print("大寫:\(temp.uppercased())") } changeOptionalStringToUpperCase()
當您運行上述程序時,輸出將是:
名稱為nil。 無法處理
在上面的程序中,您可以看到未包裝的值temp正在 guard 語句定義的范圍之外使用。由于name被定義為可選且包含 nil 值,因此guard語句無法解包該值。
因此,在guard else中執(zhí)行的語句打印Name為nil。無法在輸出中處理,并用 return 語句終止函數。上述 guard 語句 if else 語句的等效代碼為:
func changeOptionalStringToUpperCase() { var name:String? if let temp = name { print("大寫:\(temp.uppercased())") } else { print("名稱為 nil。無法處理") return } //如何在這里訪問? 解決方案:使用Guard } changeOptionalStringToUpperCase()
注意,上面兩個語句都是有效的,并且完成相同的工作。但是使用 if-let 語句時,不能在 if-let 語句之外使用 未包裝(unwrapped)值。但是使用守衛(wèi)語句,您可以通過函數使用 未包裝(unwrapped) 值。
Guard語句還可以鏈接多個條件,這些條件之間用逗號(,)分隔,如下所示:
func changeOptionalStringToUpperCase() { var name:String? = "" guard let temp = name , temp.count > 0 else { print("名稱為nil或空字符串。 無法處理") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase()
當您運行上述程序時,輸出將是:
名稱為nil或空字符串。 無法處理
在上面的程序中,guard語句包含兩個條件,以逗號分隔。
第一個條件 let temp = name 解開了一個可選參數,在我們的實例中,該條件返回true,第二個條件 temp.count > 0 檢查解包后的字符串是否包含超過0個字符,在我們的示例中結果為false。
因此,guard語句內的語句執(zhí)行語句 print("名稱為nil或空字符串。 無法處理") ,其輸出Name為nil或空字符串。 無法在控制臺中處理,并使用return語句終止該函數。