多个let在guard语句中和单个let是否相同?

9

这两者是否有功能上的区别:

guard let foo = bar, let qux = taco else { 
  ...
}

并且:

guard let foo = bar, qux = taco else {
  ...
}

在我看来,它们是相同的,多余的let并不是必需的?


4
第二种变体在Swift 2中是允许的,但在Swift 3中已不再被允许。 - Martin R
2个回答

18

在 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 子句中进行所有布尔检查(有时无法表达条件)。


好的,知道了。显然我还在使用Swift 2。我有一个代码检查工具正在抱怨第一个语法,当我们升级时需要进行一些更改。谢谢! - i_am_jorf
如果你在使用 Swift 2.3,Xcode 8本身会定期显示此错误,然后在编译器做出一些最终的处理之后,错误会消失。 - GetSwifty

7

在Swift 3.0中情况已经不同了。当您应用多个变量时,Xcode会出现错误并要求添加let

enter image description here

因此,您应该使用

guard let foo = bar, let qux = taco else { 
  ...
}

在Swift 4中也是一样的,每个guard检查都必须需要一个'let'! - Naishta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接