Swift If Statement描述了如何根据特定条件(布尔值)执行操作。在本文中,我们将探讨Guard语句相对于if语句的好处,以控制程序流程并编写更简单,更干净的代码。
Swift Guard声明
Guard语句的主要用途是在某些条件下将程序控制权移出范围。这些语句与if语句类似,后者根据特定条件(布尔值)执行语句,但与if不同,guard语句仅在不满足特定条件时运行。
而且,保护内部的语句必须退出范围。因此,我们必须在用户程序控制语句的return
, break
, continue
或throw
在Guard语句的末尾。
保护声明的语法
guard expression else {
//statements
//must contain a control statement:return, break, continue or throw.
}
- 在这里, expression是一个布尔表达式(返回
true
或false
)。 - 如果表达式的计算结果为
false
,则将执行guard
的代码块内的语句。 - 如果表达式的计算结果为
true
,则guard
代码块内的语句将从执行中跳过。
保卫声明如何工作?
注意:guard语句的末尾必须包含控制语句return
, break
, continue
或throw
。
示例1:保护声明如何工作?
一个简单的有效警卫声明如下:
guard true else {
print("Condition not met")
}
print("Condition met")
运行该程序时,输出为:
Condition met
在上述程序中,guard包含一个布尔值true(满足条件)。由于guard语句仅在不满足条件时运行,因此不会执行guard内的语句。这就是为什么执行print("Condition met")
并在屏幕上输出满足 print("Condition met")
的原因。
现在,将条件更改为false:
示例2:guard语句必须退出范围
guard false else {
print("Condition not met")
}
print("Condition met")
在上面的程序中,保护条件评估为false
。因此,应执行else内部的语句print("Condition not met")
。但是您会收到一条错误消息,说“后卫”机体可能不会掉落,请考虑使用“返回”或“投掷”退出示波器。
简单来说,错误消息意味着,您需要使用return
, break
, continue
或throw
语句从Guard语句转移程序控制。现在,我们将使用return
。由于return
语句只能在函数内部使用,因此我们将上述代码包装在Swift函数中 。
示例3: 函数内部的保护声明
我们可以在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
在上述程序中,保护条件的计算结果为false
,因此执行保护内部的语句。第一条语句print("Condition not met")
输出控制台中不满足的条件 。
及本声明return
函数的终止执行,并声明print("Hello, after function call")
这之后在控制台函数调用输出你好 函数调用之后。
示例4:带有可选选项的防护
我们在Swift Optionals中看到了使用if-let
来拆开可选对象的情况。但是,我们也可以使用guard语句代替if-let
来展开具有一个优点的可选内容。使用防护而不是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语句无法解包该值。
因此,将执行后卫内部的语句,其中打印的名称为nil。无法处理输出并使用return
语句终止函数 。上述保护语句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语句之外使用未包装的值。但是使用保护语句,您可以在整个函数使用未包装的值。
例子5:有多个条件的守卫
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为nil或空字符串。无法在控制台中处理 ,并使用return
语句终止该函数 。