原文: https://www.programiz.com/swift-programming/guard-statement

在本文中,您将学习使用Guard语句来控制程序执行的流程。

Swift If语句描述了如何根据特定条件(布尔值)执行操作。 在本文中,我们将探讨Guard语句相对于if语句的好处,以控制程序流程并编写更简单,更干净的代码。

Guard语句

Guard语句的主要用途是在某些条件下将程序控制权移出范围。 这些语句与if语句类似,后者根据特定条件(布尔值)执行语句,但与if不同,guard语句仅在不满足特定条件时运行。

而且,guard内部的语句必须退出范围。 因此,我们必须在guard语句的末尾使用用户程序控制语句returnbreakcontinuethrow


guard语句的语法

  1. guard expression else {
  2. //statements
  3. //must contain a control statement:return, break, continue or throw.
  4. }
  • 在这里,expression是布尔表达式(返回truefalse)。
  • 如果将expression求值为false,则将执行guard代码块内部的语句。
  • 如果将expression求值为true,则将跳过guard代码块内部的语句。

guard语句如何工作?

`Guard`语句 - 图1

注意:guard语句的末尾必须包含控制语句returnbreakcontinuethrow


示例 1:guard语句如何工作?

一个简单的有效Guard语句如下:

  1. guard true else {
  2. print("Condition not met")
  3. }
  4. print("Condition met")

运行该程序时,输出为:

  1. Condition met

在上面的程序中,guard包含一个布尔值true(满足条件)。 由于guard语句仅在不满足条件时运行,因此不会执行guard内的语句。 这就是执行print("Condition met")并在屏幕上输出Condition met的原因。

现在,将条件更改为false


示例 2:guard语句必须退出范围

  1. guard false else {
  2. print("Condition not met")
  3. }
  4. print("Condition met")

在以上程序中,guard条件求值为false。 因此,else内部的print("Condition not met")语句应执行。 但是您会收到一个错误消息,说guard主体可能不会退出,请考虑使用returnthrow退出示波器。

简单的错误消息表示,您需要使用returnbreakcontinuethrow语句从guard语句转移程序控制。 现在,我们将使用return。 并且由于return语句只能在函数内部使用,因此我们将上述代码包装在 Swift 函数中。


示例 3:函数内部的guard语句

我们可以在 Swift 的函数中使用 guard 语句:

  1. func someFunction() {
  2. guard false else {
  3. print("Condition not met")
  4. return
  5. }
  6. print("Condition met")
  7. }
  8. someFunction()
  9. print("Hello after function call")

当您运行上述程序时,输出将是:

  1. Condition not met
  2. 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的主要优点是,我们可以扩大展开的变量的范围。

让我们在下面的示例中看到这一点:

  1. func changeOptionalStringToUpperCase() {
  2. var name:String?
  3. guard let temp = name else {
  4. print("Name is nil. Cannot process")
  5. return
  6. }
  7. print("Uppercased:\(temp.uppercased())")
  8. }
  9. changeOptionalStringToUpperCase()

运行该程序时,输出为:

  1. Name is nil. Cannot process

在上述程序中,您可以看到,在guard语句定义的范围之外使用了未包装的值temp。 由于name被定义为可选并且包含nil值,因此guard语句无法解包该值。

因此,将执行后卫内部的语句,该语句打印Name is nil. Cannot process,并使用return语句终止函数。 上述guard语句if-else语句的等效代码是:

  1. func changeOptionalStringToUpperCase() {
  2. var name:String?
  3. if let temp = name {
  4. print("Uppercased:\(temp.uppercased())")
  5. } else {
  6. print("Name is nil. Cannot process")
  7. return
  8. }
  9. //how to access temp here?? Solution:Use Guard
  10. }
  11. changeOptionalStringToUpperCase()

注意上面的两个语句都是有效的并且执行相同的工作。 但是,使用if-let语句不能在if-let语句之外使用未包装的值。 但是,通过使用Guard语句,您可以在整个函数中使用未包装的值。


范例 5:有多种条件的Guard

Guard语句还可以链接多个条件,这些条件之间用逗号(,)分隔,如下所示:

  1. func changeOptionalStringToUpperCase() {
  2. var name:String? = ""
  3. guard let temp = name , temp.count > 0 else {
  4. print("Name is nil or an empty string. Cannot process")
  5. return
  6. }
  7. print("Uppercased:\(temp.uppercased())")
  8. }
  9. changeOptionalStringToUpperCase()

运行该程序时,输出为:

  1. 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语句终止函数。