swift - swift if case 和可选绑定
问题描述
下面的三个代码块有什么区别?
- 可选绑定
let someInt: Int? = 42
if let x = someInt {
print(x)
}
- 枚举案例模式
let someInt: Int? = 42
if case .some(let x) = someInt {
print(x)
}
- 可选案例模式
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)
}
我只想说,该死的语言令人困惑。
解决方案
您显示的前三个代码片段是相同的。在这三个中,第一个(可选绑定)绝对是在 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)
, 和,
值绑定模式中的标识符模式将新的命名变量或常量绑定到它们的匹配值。
推荐阅读
- github - 不可能从
- tensorflow2.0 - AttributeError:“InteractiveSession”对象没有属性“小”
- javascript - 如何使障碍物撞到墙壁而不是穿过墙壁/Javascript,Html,CSS的障碍物
- java - Keycloak 创建客户端
- javascript - css 和 html 的 z-index 问题
- java - Java apache httpclient 发布请求
- python - SyntaxError:训练神经网络模型时语法无效
- regex - PowerShell在运算符后替换未知的3个字母单词
- scene - 将场景转换为附加脚本的类型或通过在 Godot 中传递参数进行实例化
- python - 如何使用 Telethon 找出谁加入了电报频道