这两者是否有功能上的区别:
guard let foo = bar, let qux = taco else {
...
}
并且:
guard let foo = bar, qux = taco else {
...
}
在我看来,它们是相同的,多余的let
并不是必需的?
在 Swift 3 中这些是不同的。在这种情况下:
guard let foo = bar, let qux = taco else {
你的意思是“将可选项 unwrap(展开)成 foo。如果成功,将可选项 unwrap 成 qux。如果成功继续执行。否则......”
另一方面,这个:
guard let foo = bar, qux = taco else {
说:“将可选的解包 bar 赋值给 foo。将赋值语句 qux = taco
作为布尔值进行评估。”由于在 Swift 中赋值语句不返回布尔值,因此这是语法错误。
这个改变使得更加灵活的 guard
语句成为可能,因为你可以在整个链中混合使用可选解包和布尔值。在 Swift 2.2 中,你必须先解包所有内容,然后在 where
子句中进行所有布尔检查(有时无法表达条件)。