在本文中,您将学习使用Guard语句来控制程序执行的流程。
Swift If 语句描述了如何基于特定条件(布尔值)执行操作。在本文中,我们将学习 guard 语句优于 if 语句的优点,以控制程序流,并编写更简单和干净的代码。
Guard语句语句的主要用途是在一定条件下将程序控制转移到某个范围之外。这些语句与基于特定条件(布尔值)执行语句的if语句类似,但与if不同,guard语句只在不满足某些条件时运行。
此外, guard 语句必须从范围中退出。因此,我们必须在 guard 语句的末尾使用用户程序控制语句return、break、continue或throw。
guard expression else { //语句 //必须包含一个控制语句: return、 break、 continue 或 throw。 }
这里 expression是一个布尔表达式(返回true或false)。
如果 expression 值计算为false,则执行代码块内的 guard 语句。
如果 expression 值计算为 true,则代码块内的 guard 语句将从执行中跳过。
注意:guard语句的结束必须包含一个控制语句 return,break,continue 或 throw。
一个简单的有效guard 语句如下:
guard true else { print("条件不满足") } print("满足条件")
运行该程序时,输出为:
满足条件
在上述程序中,guard 包含一个布尔值true(满足条件)。由于guard语句仅在不满足条件时运行,因此不会执行 guard内的语句。这就是为什么执行 print("满足条件") 并在屏幕上输出满足条件的原因。
现在,将条件更改为 false:
guard false else { print("条件不满足") } print("满足条件")
在上述程序中,保护条件的计算结果为false。所以,应该执行else中的print("Condition not met")语句。但是您将收到一个错误消息:'guard' body may not fall through, consider using a 'return' or 'throw' to exit the scope.
错误消息意味着,您需要使用return、break、continue或throw语句从guard语句转移程序控制。现在我们将使用return。由于return语句只能在函数内部使用,所以我们将把上面的代码包装在Swift函数中。
我们可以在Swift的函数中使用guard语句,如下所示:
func someFunction() { guard false else { print("条件不满足") return } print("满足条件") } someFunction() print("函数调用后输出 Hello")
当您运行上述程序时,输出将是:
条件不满足 函数调用后输出 Hello
在上述程序中,guard 条件的计算结果为 false,因此执行guard 内部的语句。第一条语句print("条件不满足")在控制台中输出:条件不满足。
并且语句 return 终止函数的执行,同时 print("Hello, after function call") 函数调用执行后的语句在控制台中输出:函数调用后输出 Hello。
我们在Swift Optionals中已经看到使用 if-let 来解开一个 Optional。但是,我们也可以使用guard语句代替if-let来展开可选语句,这有一个好处。使用guard而不是if-let展开可选变量的主要优点是,我们可以增加解包变量的作用域。
让我们在下面的示例中看到这一点:
func changeOptionalStringToUpperCase() { var name:String? guard let temp = name else { print("名称为nil。 无法处理") return } print("大写:\(temp.uppercased())") } changeOptionalStringToUpperCase()
当您运行上述程序时,输出将是:
名称为nil。 无法处理
在上面的程序中,您可以看到未包装的值temp正在 guard 语句定义的范围之外使用。由于name被定义为可选且包含 nil 值,因此guard语句无法解包该值。
因此,在guard else中执行的语句打印Name为nil。无法在输出中处理,并用 return 语句终止函数。上述 guard 语句 if else 语句的等效代码为:
func changeOptionalStringToUpperCase() { var name:String? if let temp = name { print("大写:\(temp.uppercased())") } else { print("名称为 nil。无法处理") return } //如何在这里访问? 解决方案:使用Guard } changeOptionalStringToUpperCase()
注意,上面两个语句都是有效的,并且完成相同的工作。但是使用 if-let 语句时,不能在 if-let 语句之外使用 未包装(unwrapped)值。但是使用守卫语句,您可以通过函数使用 未包装(unwrapped) 值。
Guard语句还可以链接多个条件,这些条件之间用逗号(,)分隔,如下所示:
func changeOptionalStringToUpperCase() { var name:String? = "" guard let temp = name , temp.count > 0 else { print("名称为nil或空字符串。 无法处理") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase()
当您运行上述程序时,输出将是:
名称为nil或空字符串。 无法处理
在上面的程序中,guard语句包含两个条件,以逗号分隔。
第一个条件 let temp = name 解开了一个可选参数,在我们的实例中,该条件返回true,第二个条件 temp.count > 0 检查解包后的字符串是否包含超过0个字符,在我们的示例中结果为false。
因此,guard语句内的语句执行语句 print("名称为nil或空字符串。 无法处理") ,其输出Name为nil或空字符串。 无法在控制台中处理,并使用return语句终止该函数。