有时,我想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)
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结果,我应该将其移出where吗guard?或者我对优先级或 let & where 的理解是错误的?
你是对的,在你的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 块,而不检查其余条件。
| 归档时间: |
|
| 查看次数: |
1725 次 |
| 最近记录: |