📜  Swift Guard声明

📅  最后修改于: 2020-10-09 16:03:24             🧑  作者: Mango

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

 

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

Swift Guard声明

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

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


保护声明的语法
guard expression else {
    //statements
    //must contain a control statement:return, break, continue or throw.
}
  • 在这里, expression是一个布尔表达式(返回truefalse )。
  • 如果表达式的计算结果为false ,则将执行guard的代码块内的语句。
  • 如果表达式的计算结果为true ,则guard代码块内的语句将从执行中跳过。

保卫声明如何工作?

How Swift guard statement works?

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


示例1:保护声明如何工作?

一个简单的有效警卫声明如下:

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

运行该程序时,输出为:

Condition met

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

现在,将条件更改为false:


示例2:guard语句必须退出范围
guard false else {
    print("Condition not met")
}
print("Condition met")

在上面的程序中,保护条件评估为false 。因此,应执行else内部的语句print("Condition not met") 。但是您会收到一条错误消息,说“后卫”机体可能不会掉落,请考虑使用“返回”或“投掷”退出示波器。

简单来说,错误消息意味着,您需要使用returnbreakcontinuethrow语句从Guard语句转移程序控制。现在,我们将使用return 。由于return语句只能在函数内部使用,因此我们将上述代码包装在Swift函数中


示例3: 函数内部的保护声明

我们可以在Swift的函数中使用guard语句,如下所示:

func someFunction() {

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

someFunction()
print("Hello after function call")

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

Condition not met
Hello after function call

 

在上述程序中,保护条件的计算结果为false ,因此执行保护内部的语句。第一条语句print("Condition not met")输出控制台中不满足的条件

及本声明return 函数的终止执行,并声明print("Hello, after function call")之后在控制台函数调用输出你好 函数调用之后。


示例4:带有可选选项的防护

我们在Swift Optionals中看到了使用if-let来拆开可选对象的情况。但是,我们也可以使用guard语句代替if-let来展开具有一个优点的可选内容。使用防护而不是if-let来展开可选内容的主要优点是,我们可以扩大展开的变量的范围。

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

func changeOptionalStringToUpperCase() {

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

changeOptionalStringToUpperCase()

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

Name is nil. Cannot process

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

因此,将执行后卫内部的语句,其中打印的名称为nil。无法处理输出并使用return语句终止函数 。上述保护语句if-else的等效代码是:

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语句之外使用未包装的值。但是使用保护语句,您可以在整个函数使用未包装的值。


例子5:有多个条件的守卫

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

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

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为nil或空字符串。无法在控制台中处理 ,并使用return语句终止该函数 。