swift guard语句 – Swift最新教程

上一章Swift教程请查看:swift continue语句

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

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

Swift guard语句

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

而且,guard内的语句必须退出范围,因此,我们必须在guard语句结束时返回、中断、继续或抛出用户程序控制语句。

guard语句的语法

guard expression else {
    //statements
    //必须包含的语句:return, break, continue or throw.
}
  • 在这里,表达式是一个布尔表达式(返回true或false)。
  • 如果表达式被赋值为false,则执行guard代码块中的语句。
  • 如果表达式求值为true,则跳过guard代码块中的语句。

guard语句如何工作?

swift-guard语句

注意:guard语句的结尾必须包含一个控制语句return、break、continue或throw。

例1:guard语句如何工作?

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

guard true else {
    print("not met")
}
print("met")

在上面的程序中,guard包含一个布尔值true(满足条件),因为,guard语句只在条件不满足时运行,所以不会执行guard内部的语句。

示例2:guard语句必须退出作用域

guard false else {
    print("not met")
}
print("met")

在上面的程序中,保护条件的计算结果为false,因此else中的print语句应该执行。但你会得到一个错误:‘guard’ body
may not fall through, consider using a ‘return’ or ‘throw’ to exit the scope.

简单单词中的错误消息意味着,你需要使用return、break、continue或throw语句将程序控制从保护语句中转移出来。现在我们使用return,于return语句只能在函数内部使用,我们将在Swift函数中封装上面的代码。

例3:函数中的guard语句

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

func someFunction() {
    guard false else {
        print("not met")
        return
    }
    print("met")
}
someFunction()
print("after function call")

在上面的程序中,保护条件的计算结果为false,因此执行保护内的语句,一个语句print在控制台中输出not met。

语句返回终止了函数的执行,并在函数调用执行后打印语句,在控制台中输出函数调用后的。

例4:使用optional可选类型和guard

我们已经看到在快速选项中使用if-let来打开可选选项,但是,我们也可以使用guard语句来代替if-let来展开一个具有一个优点的可选语句,用guard而不是if-let来解包一个可选变量的主要好处是可以增加解包变量的作用域。

让我们看看下面的例子:

func changeOptionalStringToUpperCase() {
    var name:String?
    guard let temp = name else {
        print("Name is nil. Cannot process")
        return
    }
    print("Uppercased:\(temp.uppercased())")
}
changeOptionalStringToUpperCase()

在上面的程序中,你可以看到未包装的值temp正在guard语句定义的范围之外使用。由于name是可选的,并且包含nil值,所以guard语句无法打开该值。

Guard else中的语句执行它输出的是Name is nil.
Cannot process
,无法处理输出并使用return语句终止函数,上述guard语句if-else语句的等价代码为:

func changeOptionalStringToUpperCase() {
    
    var name:String?
    if let temp = name {
        print("Uppercased:\(temp.uppercased())")
    } else {
        print("Name is nil. Cannot process")
        return
    }
    // 使用Guard
}
changeOptionalStringToUpperCase()

请注意,上面两个语句都是有效的,并且作用相同。但是使用if-let语句时,你不能在if-let语句之外使用未包装的值。但是使用guard语句,你可以通过函数使用未包装的值。

例5:具有多个条件的guard语句

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()

在上面的程序中,guard语句包含两个由逗号分隔的条件。

在我们的例子中,第一个条件让temp = name打开一个返回true的可选条件,第二个条件temp.count >0检查打开的字符串是否有超过0个字符,在我们的例子中,该字符串的计算结果为false。

因此,guard语句中的语句执行print语句(“Name is nil or
an empty string. Cannot process
”),它的输出名称为空或空字符串,无法在控制台中处理,并使用return语句终止函数。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?