斯威夫特:守卫让我们在哪里 - 优先考虑

时间:2017-01-06 00:56:37

标签: swift

有时,我想将letwhere& 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) 简化我的代码。但我想知道let和where的优先级是什么。例如:

let check = person.check() where dont

正如您可以看到控制台结果,打印输出是:

  • 检查
  • 不应该检查

对于guard <condition> else { }语法中where的条件,即使let中的表达式与let中的表达式结果无关,Swift似乎首先执行where然后再检查let。有时在我的代码中,where可选绑定会进行大量计算,let只是一个简单的条件而不依赖where结果,我应该将guard移出{{ 1}?或者我对优先级错了,或者让&amp;在哪里?

1 个答案:

答案 0 :(得分:3)

你是对的,在 Swift 2 代码中

guard let check = person.check() where dont else { }

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

guard dont, let check = person.check() else { }

首先检查布尔条件。

语法中的“不对称”已在 Swift 3:中删除 所有的保护条款都以逗号分隔 不再使用where关键字。你有

guard let check = person.check(), dont else { }
// or
guard dont, let check = person.check() else { }

从左到右检查条件是否有短路, 即,如果一个条件失败,则执行else块而不执行 检查剩余的条件。