多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# `Guard`语句 > 原文: [https://www.programiz.com/swift-programming/guard-statement](https://www.programiz.com/swift-programming/guard-statement) #### 在本文中,您将学习使用`Guard`语句来控制程序执行的流程。 [Swift `If`语句](/swift-programming/if-else-statement "Swift if-else statement")描述了如何根据特定条件(布尔值)执行操作。 在本文中,我们将探讨`Guard`语句相对于`if`语句的好处,以控制程序流程并编写更简单,更干净的代码。 ## `Guard`语句 `Guard`语句的主要用途是在某些条件下将程序控制权移出范围。 这些语句与`if`语句类似,后者根据特定条件(布尔值)执行语句,但与`if`不同,`guard`语句仅在不满足特定条件时运行。 而且,`guard`内部的语句必须退出范围。 因此,我们必须在`guard`语句的末尾使用用户程序控制语句`return`,`break`,`continue`或`throw`。 * * * ## `guard`语句的语法 ```swift guard expression else { //statements //must contain a control statement:return, break, continue or throw. } ``` * 在这里,`expression`是布尔表达式(返回`true`或`false`)。 * 如果将`expression`求值为`false`,则将执行`guard`代码块内部的语句。 * 如果将`expression`求值为`true`,则将跳过`guard`代码块内部的语句。 * * * ## `guard`语句如何工作? ![How Swift guard statement works?](https://img.kancloud.cn/6b/53/6b53f3da18e2768a399b8d840079ba86_590x237.png "Swift guard statement") 注意:`guard`语句的末尾必须包含控制语句`return`,`break`,`continue`或`throw`。 * * * ## 示例 1:`guard`语句如何工作? 一个简单的有效`Guard`语句如下: ```swift guard true else { print("Condition not met") } print("Condition met") ``` 运行该程序时,输出为: ```swift Condition met ``` 在上面的程序中,`guard`包含一个布尔值`true`(满足条件)。 由于`guard`语句仅在不满足条件时运行,因此不会执行`guard`内的语句。 这就是执行`print("Condition met")`并在屏幕上输出`Condition met`的原因。 现在,将条件更改为`false`: * * * ## 示例 2:`guard`语句必须退出范围 ```swift 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 语句:](/swift-programming/functions "Swift functions") ```swift func someFunction() { guard false else { print("Condition not met") return } print("Condition met") } someFunction() print("Hello after function call") ``` 当您运行上述程序时,输出将是: ```swift 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`](/swift-programming/optionals "Swift Optionals")中看到了`if-let`的使用,以展开可选项。 但是,我们也可以使用`guard`语句代替`if-let`,来展开具有一个优点的可选项。 展开带`guard`的可选项而不是`if-let`的主要优点是,我们可以扩大展开的变量的范围。 让我们在下面的示例中看到这一点: ```swift func changeOptionalStringToUpperCase() { var name:String? guard let temp = name else { print("Name is nil. Cannot process") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase() ``` 运行该程序时,输出为: ```swift Name is nil. Cannot process ``` 在上述程序中,您可以看到,在`guard`语句定义的范围之外使用了未包装的值`temp`。 由于`name`被定义为可选并且包含`nil`值,因此`guard`语句无法解包该值。 因此,将执行后卫内部的语句,该语句打印`Name is nil. Cannot process`,并使用`return`语句终止函数。 上述`guard`语句`if-else`语句的等效代码是: ```swift 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`语句还可以链接多个条件,这些条件之间用逗号(`,`)分隔,如下所示: ```swift 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() ``` 运行该程序时,输出为: ```swift 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`语句终止函数。