原文: https://www.programiz.com/swift-programming/guard-statement
Swift If语句描述了如何根据特定条件(布尔值)执行操作。 在本文中,我们将探讨Guard语句相对于if语句的好处,以控制程序流程并编写更简单,更干净的代码。
Guard语句的主要用途是在某些条件下将程序控制权移出范围。 这些语句与if语句类似,后者根据特定条件(布尔值)执行语句,但与if不同,guard语句仅在不满足特定条件时运行。
而且,guard内部的语句必须退出范围。 因此,我们必须在guard语句的末尾使用用户程序控制语句return,break,continue或throw。
guard expression else {
//statements
//must contain a control statement:return, break, continue or throw.
}- 在这里,
expression是布尔表达式(返回true或false)。 - 如果将
expression求值为false,则将执行guard代码块内部的语句。 - 如果将
expression求值为true,则将跳过guard代码块内部的语句。
注意:guard语句的末尾必须包含控制语句return,break,continue或throw。
一个简单的有效Guard语句如下:
guard true else {
print("Condition not met")
}
print("Condition met") 运行该程序时,输出为:
Condition met在上面的程序中,guard包含一个布尔值true(满足条件)。 由于guard语句仅在不满足条件时运行,因此不会执行guard内的语句。 这就是执行print("Condition met")并在屏幕上输出Condition met的原因。
现在,将条件更改为false:
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 函数中。
我们可以在 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。
我们已经在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语句,您可以在整个函数中使用未包装的值。
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语句终止函数。
