有时,我想将let
与where
& 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;在哪里?
答案 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块而不执行 检查剩余的条件。