gpt4 book ai didi

swift if 大小写和可选绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 01:09:08 24 4
gpt4 key购买 nike

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

  1. 可选绑定(bind)
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)
}

我只想说,这该死的语言太困惑了。

最佳答案

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

You use optional binding to find out whether an optional contains a value, and if so, to make that value available as a temporary constant or variable.

另外两种方式,我觉得有点迂回。你为什么要写x + 2 - 1什么时候你可以写 x + 1

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

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

An optional pattern matches values wrapped in a some(Wrapped) case of an Optional<Wrapped> enumeration.

OTOH,有时您不能使用可选绑定(bind),例如在 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)")
}

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

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

您需要使用 value binding pattern喜欢let x?在这种情况下。可选模式扩展为 let .some(x) , 和,

Identifiers patterns within a value-binding pattern bind new named variables or constants to their matching values.

关于swift if 大小写和可选绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65404303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com