警卫案件分配

时间:2018-12-17 18:43:47

标签: swift

好吧...这是代码

func howMany() -> Int {
   return 10
}

func Call() -> Void {
   guard case let output = howMany(), output > 5 else { return }
}

Call()

我并不真正了解警卫案的运作方式。这看起来很像是一个模式匹配条件,我们比较 howMany()的结果是否等于 output ,如果是,则将值分配给 output ,然后将其与文字值 5 进行比较。但是,当我删除 output> 5 这一行时,编译器会说:“保护条件始终为真,正文不可访问。”

根据模式,如果我们将其转换为switch语句,则看起来很像这样

switch howMany() {
   case let output where output > 5:
      break;
}

问题是,如果可以将其直接转换为switch语句,那么在删除where条件时,不应出现“保护条件始终为真,正文不可访问”的警告

我希望有人能对此有所启发。

1 个答案:

答案 0 :(得分:3)

考虑:

func foo() {
    guard case let output = howMany(), output > 5 else {
        print("less than or equal to 5")
        return
    }

    print("\(output) is greater than 5")
}

大致相当于:

func bar() {
    switch howMany() {
    case let output where output > 5:
        print("\(output) is greater than 5")

    default:
        print("less than or equal to 5")
        return
    }
}

如果您删除了> 5个条件:

func foo() {
    guard case let output = howMany() else {
        print("less than or equal to 5")
        return
    }

    print("\(output) is greater than 5")
}

您得到警告:

  

'守卫'条件始终为真,身体无法触及

该警告是正确的,因为身体 无法到达。

如果您在switch示例中进行了等效操作:

func bar() {
    switch howMany() {
    case let output:
        print("\(output) is greater than 5")

    default:
        print("less than or equal to 5")
        return
    }
}

如果您这样做,将会收到类似的警告:

  

默认将永远不会执行

同样,这是有道理的,因为将不会到达default

现在,考虑没有switch子句的示例default

func bar() {
    switch howMany() {
    case let output:
        print("output:", output)
    }
}

您不会在这里收到警告仅仅是因为没有default子句(guard语句的“ body”的类似物)。