首页 > 解决方案 > swift if case 和可选绑定

问题描述

下面的三个代码块有什么区别?

  1. 可选绑定
let someInt: Int? = 42
if let x = someInt {
  print(x)
}
  1. 枚举案例模式
let someInt: Int? = 42
if case .some(let x) = someInt {
  print(x)
}
  1. 可选案例模式
let someInt: Int? = 42
if case let x? = someInt {
  print(x)
}

为什么这么简单的功能需要 3 种不同的语法?这让语言太混乱了!

为什么下面的代码不起作用?

let someInt: Int? = 42
var x: Int?
if case x? = someInt {
  print(x)
}

我只想说,该死的语言令人困惑。

标签: swift

解决方案


您显示的前三个代码片段是相同的。在这三个中,第一个(可选绑定)绝对是在 if 语句中绑定可选的推荐方法,正如Swift 指南所推荐的那样:

您使用可选绑定来确定可选是否包含值,如果是,则使该值可用作临时常量或变量。

我觉得另外两种方式比较迂回。x + 2 - 1当你能写的时候你为什么要写x + 1

枚举案例模式之所以有效,是因为Optional它被实现为枚举。

根据Swift Reference,可选模式只是枚举案例模式的语法糖,适用于以下特殊情况Optional

可选模式匹配枚举some(Wrapped)案例中包装的值。Optional<Wrapped>

OTOH,有时您不能使用可选绑定,例如在 for 循环或 switch 语句中。这些是可选模式派上用场的时候。Swift 参考中的一个例子:

let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
// Match only non-nil values.
for case let number? in arrayOfOptionalInts {
    print("Found a \(number)")
}

如果您查看控制流语句和循环的语法,您会注意到模式可以用在比可选绑定更多的地方。枚举案例模式和可选模式是模式,但可选绑定不是模式。

第四个代码段不打印任何内容,因为Optional.some(42)与 pattern 不匹配x?。回想一下可选模式匹配的内容,它匹配.some(x). x是 nil (你还没有将它初始化为任何东西),所以你匹配.some(42).some(.none). 显然它们不匹配,因此 if 语句不会运行。即使它确实运行了,打印x也会给你nil,因为这是模式匹配,而不是变量赋值。如果你想做一些类似于分配变量的事情......

在这种情况下,您需要使用值绑定模式let x?。可选模式扩展为let .some(x), 和,

值绑定模式中的标识符模式将新的命名变量或常量绑定到它们的匹配值。


推荐阅读