Swift guard 语句

在本教程中,我们将学习如何使用 guard 语句来控制程序的执行流程。

在 Swift 中,当不满足某些条件时,我们使用 guard 语句将程序控制转移到范围之外。

guard 语句与 if 语句类似,但有一个主要区别。if 语句在满足某个条件时运行。但是,当不满足某个条件时,guard 语句将运行。


guard 语句的语法

guard 语句的语法为:

  1. guard expression else {
  2. // statements
  3. // control statement: return, break, continue or throw.
  4. }

这里,表达式返回 truefalse。如果表达式的计算结果为:

  • true - 不执行 guard 代码块内的语句
  • false - 执行 guard 代码块内的语句
注意:我们必须使用 returnbreakcontinuethrow 退出 guard 的范围。

guard 语句流程图


实例

  1. var i = 2
  2. while (i <= 10) {
  3. // guard condition to check the even number
  4. guard i % 2 == 0 else {
  5. i = i + 1
  6. continue
  7. }
  8. print(i)
  9. i = i + 1
  10. }

结果为:

  1. 2
  2. 4
  3. 6
  4. 8
  5. 10

在上面的实例中,我们使用了 guard 语句来检查数字是偶数还是奇数。注意这一行,

  1. guard i % 2 == 0 else {...}

在这里,如果:

  • 奇数 -,i%2==0 的计算结果为 false。并且,执行保护内部的代码。
  • 偶数 -,i%2==0 的计算结果为 true。并且,跳过保护内部的代码。

因此,我们得到的结果都是偶数。

我们使用了 guard 中的 continue 语句 将控制转移到循环的下一次迭代。

注意:必须使用 continuebreak 等控制语句。否则,产生一个错误:'guard' body must not fall through, consider using a 'continue' or 'return' to exit the scope

函数内部的 guard 语句

guard 语句通常与函数一起使用。函数是执行特定任务的代码块。要了解更多信息,请访问Swift 函数。

让我们看看如何使用函数的 guard 语句。

  1. // create a function
  2. func checkOddEven() {
  3. var number = 23
  4. // use of guard statement
  5. guard number % 2 == 0 else {
  6. print("Odd Number")
  7. return
  8. }
  9. print("Even Number")
  10. }
  11. // function call
  12. checkOddEven()

结果如下:

  1. Odd Number

在上面的实例中,我们创建了一个名为 checkOddEven() 的函数。注意函数中使用了 guard 语句。

  1. guard number % 2 == 0 else {
  2. print("Odd Number")
  3. return
  4. }

这里,guard 语句判断 number 是偶数还是奇数。由于 number是奇数,条件 number%2==0 返回 false

因此,执行 guard 语句中的代码。

现在,让我们将 number 的值改为偶数,比如 24

  1. // create a function
  2. func checkOddEven() {
  3. var number = 24
  4. // use of guard statement
  5. guard number % 2 == 0 else {
  6. print("Odd Number")
  7. return
  8. }
  9. print("Even Number")
  10. }
  11. // function call
  12. checkOddEven()

结果如下:

  1. Even Number

在这里,由于 number 是偶数,条件 number%2==0 的计算结果为 true

因此,将跳过 guard 语句中的代码,并执行函数中的其他代码。因此,我们得到偶数作为输出。


多条件使用 guard

guard 语句还可以使用多个条件,以逗号(,)分隔,如下所示:

  1. func checkJobEligibility() {
  2. var age = 33
  3. guard age >= 18, age <= 40 else {
  4. print("Not Eligible for Job")
  5. return
  6. }
  7. print("You are eligible for this job")
  8. }
  9. checkJobEligibility()

结果如下:

  1. You are eligible for this job

在上面的实例中,guard 语句包含两个以逗号分隔的条件。

这里,两个条件之间存在逻辑与关系。也就是说,只有当两个条件都为 true 时,保护条件才为 true


guard-let 语句

在使用 Swift 可选类型 时,guard 语句用作 guard-let 语句。例如:

  1. func checkAge() {
  2. var age: Int? = 22
  3. guard let myAge = age else {
  4. print("Age is undefined")
  5. return
  6. }
  7. print("My age is \(myAge)")
  8. }
  9. checkAge()

结果如下:

  1. My age is 22

在上面的实例中,我们创建了一个名为 age 的可选变量。这里,我们使用 guard-let 语句检查 age 是否包含值。

由于 age 包含一些值,因此不执行 guard-let 块内的代码。这类似于 guardtrue 的情况。


guard 与 if 语句对比

guard 语句是作为 if 语句的替代语句引入的。例如

假设我们想检查一个人是否有资格投票,我们可以使用 if 语句,

  1. func voteEligibility() {
  2. var age = 42
  3. if age >= 18 {
  4. print("Eligible to vote")
  5. }
  6. else {
  7. print("Not eligible to vote")
  8. }
  9. }
  10. voteEligibility()

结果为:

  1. Eligible to vote

可以使用 guard 语句编写相同的程序,如下所示:

  1. func voteEligibility() {
  2. var age = 42
  3. guard age >= 18 else {
  4. print("Not Eligible to vote")
  5. return
  6. }
  7. print("Eligible to vote")
  8. }
  9. voteEligibility()

结果如下:

  1. Eligible to vote

正如您所看到的,使用 guard 语句,只要条件求值为 false,我们就可以退出函数。