原文: https://www.programiz.com/swift-programming/guard-statement
在本文中,您将学习使用Guard语句来控制程序执行的流程。
Swift If语句描述了如何根据特定条件(布尔值)执行操作。 在本文中,我们将探讨Guard语句相对于if语句的好处,以控制程序流程并编写更简单,更干净的代码。
Guard语句
Guard语句的主要用途是在某些条件下将程序控制权移出范围。 这些语句与if语句类似,后者根据特定条件(布尔值)执行语句,但与if不同,guard语句仅在不满足特定条件时运行。
而且,guard内部的语句必须退出范围。 因此,我们必须在guard语句的末尾使用用户程序控制语句return,break,continue或throw。
guard语句的语法
guard expression else {//statements//must contain a control statement:return, break, continue or throw.}
- 在这里,
expression是布尔表达式(返回true或false)。 - 如果将
expression求值为false,则将执行guard代码块内部的语句。 - 如果将
expression求值为true,则将跳过guard代码块内部的语句。
guard语句如何工作?

注意:guard语句的末尾必须包含控制语句return,break,continue或throw。
示例 1:guard语句如何工作?
一个简单的有效Guard语句如下:
guard true else {print("Condition not met")}print("Condition met")
运行该程序时,输出为:
Condition met
在上面的程序中,guard包含一个布尔值true(满足条件)。 由于guard语句仅在不满足条件时运行,因此不会执行guard内的语句。 这就是执行print("Condition met")并在屏幕上输出Condition met的原因。
现在,将条件更改为false:
示例 2:guard语句必须退出范围
guard false else {print("Condition not met")}print("Condition met")
在以上程序中,guard条件求值为false。 因此,else内部的print("Condition not met")语句应执行。 但是您会收到一个错误消息,说guard主体可能不会退出,请考虑使用return或throw退出示波器。
简单的错误消息表示,您需要使用return,break,continue或throw语句从guard语句转移程序控制。 现在,我们将使用return。 并且由于return语句只能在函数内部使用,因此我们将上述代码包装在 Swift 函数中。
示例 3:函数内部的guard语句
我们可以在 Swift 的函数中使用 guard 语句:
func someFunction() {guard false else {print("Condition not met")return}print("Condition met")}someFunction()print("Hello after function call")
当您运行上述程序时,输出将是:
Condition not metHello after function call
在上述程序中,guard条件的计算结果为false,因此执行guard内部的语句。 第一个语句print("Condition not met")在控制台输出Condition not met。
并且语句return终止函数的执行,并且执行函数调用后的语句print("Hello, after function call")在控制台中输出Hello after function call。
示例 4:带有可选项的guard
我们已经在Swift Optional中看到了if-let的使用,以展开可选项。 但是,我们也可以使用guard语句代替if-let,来展开具有一个优点的可选项。 展开带guard的可选项而不是if-let的主要优点是,我们可以扩大展开的变量的范围。
让我们在下面的示例中看到这一点:
func changeOptionalStringToUpperCase() {var name:String?guard let temp = name else {print("Name is nil. Cannot process")return}print("Uppercased:\(temp.uppercased())")}changeOptionalStringToUpperCase()
运行该程序时,输出为:
Name is nil. Cannot process
在上述程序中,您可以看到,在guard语句定义的范围之外使用了未包装的值temp。 由于name被定义为可选并且包含nil值,因此guard语句无法解包该值。
因此,将执行后卫内部的语句,该语句打印Name is nil. Cannot process,并使用return语句终止函数。 上述guard语句if-else语句的等效代码是:
func changeOptionalStringToUpperCase() {var name:String?if let temp = name {print("Uppercased:\(temp.uppercased())")} else {print("Name is nil. Cannot process")return}//how to access temp here?? Solution:Use Guard}changeOptionalStringToUpperCase()
注意上面的两个语句都是有效的并且执行相同的工作。 但是,使用if-let语句不能在if-let语句之外使用未包装的值。 但是,通过使用Guard语句,您可以在整个函数中使用未包装的值。
范例 5:有多种条件的Guard
Guard语句还可以链接多个条件,这些条件之间用逗号(,)分隔,如下所示:
func changeOptionalStringToUpperCase() {var name:String? = ""guard let temp = name , temp.count > 0 else {print("Name is nil or an empty string. Cannot process")return}print("Uppercased:\(temp.uppercased())")}changeOptionalStringToUpperCase()
运行该程序时,输出为:
Name is nil or an empty string. Cannot process
在上面的程序中,guard语句包含两个条件,以逗号分隔。
在我们的例子中,第一个条件let temp = name解开了一个可选参数,该可选参数返回true,第二个条件temp.count > 0检查了已解包的字符串是否包含超过 0 个字符,在我们的示例中,结果为false。
因此,guard语句内部的语句执行语句print("Name is nil or an empty string. Cannot process"),该语句输出Name is nil or an empty string. Cannot process并使用return语句终止函数。
