有时,我想用guard
结合let
& 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)
正如您所看到的控制台结果,打印输出为:
对于条件为let check = person.check() where dont
in guard <condition> else { }
语法,甚至表达式where
与表达式的结果无关let
, Swift 似乎执行let
首先然后检查where
之后。有时在我的代码中,let
可选绑定需要大量计算where
只是一个简单的条件,不依赖let
结果,我应该移动where
out of guard
?或者我对优先级或 let & where 的理解是错误的?
你是对的,在你的Swift 2 code
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 块,而无需
检查剩余条件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)