【问题标题】:Are multiple lets in a guard statement the same as a single let?保护语句中的多个 let 是否与单个 let 相同?
【发布时间】:2017-02-04 05:50:17
【问题描述】:

两者之间有什么功能上的区别:

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

还有:

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

在我看来它们是一样的,不需要额外的let

【问题讨论】:

  • 第二个变体在 Swift 2 中是允许的,但在 Swift 3 中不再允许。

标签: swift swift3 guard


【解决方案1】:

这些在 Swift 3 中是不同的。在这种情况下:

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

你说的是“可选-将 bar 解包到 foo 中。如果成功,可选地将 taco 解包到 qux 中。如果成功则继续。否则...”

另一方面:

guard let foo = bar, qux = taco else {

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

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

【讨论】:

  • 好的,很高兴知道。显然我仍在使用 swift 2。我有一个 linter 抱怨第一个语法在我们升级时需要进行一些更改。谢谢!
  • 如果您使用的是 Swift 2.3,Xcode 8 本身会定期显示一个错误,然后在编译器进行的最后一次通过时它会消失。
【解决方案2】:

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

所以你应该使用

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

【讨论】:

  • 在 Swift 4 中也一样,每次警卫检查都需要一个“让”!
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多