Swift:guard let 和 where - 优先级

bub*_*uxu 2 swift

有时,我想guardlet&结合使用where来简化我的代码。但我想知道 let 的优先级是什么以及在哪里。例如:

class Person {
    func check() -> Bool? {
        print("checking")
        return nil
    }
}

func test(dont: Bool) {
    let person = Person()
    guard let check = person.check() where dont else {
        print("should not check")
        return
    }
    print("result: \(check)")
}


test(false)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的控制台结果,打印输出为:

  • 检查
  • 不应该检查

let check = person.check() where dont对于in语法的条件guard <condition> else { },即使 in 中的表达式where与 in 中表达式的结果无关let,Swift 似乎也是let先执行后检查where。有时在我的代码中,let可选绑定需要大量计算,并且where只是一个简单的条件,不依赖于let结果,我应该将其移出whereguard?或者我对优先级或 let & where 的理解是错误的?

Mar*_*n R 5

你是对的,在你的Swift 2代码中

guard let check = person.check() where dont else { }
Run Code Online (Sandbox Code Playgroud)

首先检查条件绑定let check = ...,只有成功时才dont检查布尔条件。您可以使用

guard dont, let check = person.check() else { }
Run Code Online (Sandbox Code Playgroud)

首先检查布尔条件。

语法中的这种“不对称”已在Swift 3 中删除: 所有保护子句都用逗号分隔,并且 where不再使用关键字。所以你有了

guard let check = person.check(), dont else { }
// or
guard dont, let check = person.check() else { }
Run Code Online (Sandbox Code Playgroud)

通过短路从左到右检查条件,即如果一个条件失败,则执行 else 块,而不检查其余条件。