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

时间:2016-09-26 19:01:03

标签: swift swift3 guard

之间是否有任何功能差异:

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

在我看来,它们是相同的,并且不需要额外的guard let foo = bar, qux = taco else { ... }

2 个答案:

答案 0 :(得分:12)

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

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

你说“可选 - 展开成foo。如果成功,可选择将taco打包成qux。如果成功继续。其他......”

另一方面,这个:

guard let foo = bar, qux = taco else {

说“可选 - 解包进入foo。作为布尔值,评估分配语句qux = taco”由于赋值语句不会在Swift中返回布尔值,这是语法错误。

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

答案 1 :(得分:7)

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

enter image description here

所以你应该使用

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