多个让一个保护语句与单个let一样吗?

i_a*_*orf 7 guard swift swift3

以下是否有任何功能差异:

guard let foo = bar, let qux = taco else { 
  ...
}
Run Code Online (Sandbox Code Playgroud)

和:

guard let foo = bar, qux = taco else {
  ...
}
Run Code Online (Sandbox Code Playgroud)

在我看来他们是一样的,额外let的不是必需的?

Rob*_*ier 13

这些在Swift 3中有所不同.在这种情况下:

guard let foo = bar, let qux = taco else { 
Run Code Online (Sandbox Code Playgroud)

你说'可选 - 解开foo吧.如果成功,可选择将taco打包成qux.如果成功继续.其他......"

另一方面这个:

guard let foo = bar, qux = taco else {
Run Code Online (Sandbox Code Playgroud)

说"optional-unwrap bar into foo.作为布尔值,评估assignement语句qux = taco"由于赋值语句不返回Swift中的布尔值,这是一个语法错误.

此更改允许更灵活的guard语句,因为您可以在整个链中混合可选的展开和布尔值.在Swift 2.2中,您必须解开所有内容,然后在where子句的末尾执行所有布尔检查(这有时使得无法表达条件).


Ras*_*n L 7

不再是Swift 3.0中的不一样了.Xcode会给您一个错误,并要求您let在应用多个变量时添加.

在此输入图像描述

所以你应该使用

guard let foo = bar, let qux = taco else { 
  ...
}
Run Code Online (Sandbox Code Playgroud)