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