原文: 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 met
Hello 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
语句终止函数。