gpt4 book ai didi

swift - swift 2 中引入的可选模式有哪些优点/用例?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:42 25 4
gpt4 key购买 nike

对于像 if letguard 这样的简单情况,我没有看到优势,

if case let x? = someOptional where ... {
...
}

//I don't see the advantage over the original if let

if let x = someOptional where ... {
...
}

对于简化使用可选集合的for-case-let 案例,我真的希望swift 能更进一步:

for case let x? in optionalArray {
...
}

//Wouldn't it be better if we could just write

for let x? in optionalArray {
...
}

在谷歌搜索一段时间后,我发现唯一有用的情况是这个“Swift 2 Pattern Matching: Unwrapping Multiple Optionals”:

switch (username, password) {
case let (username?, password?):
print("Success!")
case let (username?, nil):
print("Password is missing")
...

那么引入可选模式还有其他优势吗?

最佳答案

我认为您将两个不同的概念混为一谈。诚然,语法不是很直观,但我希望它们的用途在下面得到阐明。(我建议阅读有关 Patterns in The Swift Programming Language 的页面。)

case条件

“案例条件”指的是写作能力:

  • if <strong>case</strong> <em>«pattern»</em> = <em>«expr»</em> { ... }
  • while <strong>case</strong> <em>«pattern»</em> = <em>«expr»</em> { ... }
  • for <strong>case</strong> <em>«pattern»</em> in <em>«expr»</em> { ... }

这些特别有用,因为它们可以让您提取枚举值而无需使用 switch .

你的例子,if case let x? = someOptional ... , 是一个有效的例子,但我相信它对 除了 Optional 之外的枚举 最有用。

enum MyEnum {
case A
case B(Int)
case C(String)
}

func extractStringsFrom(values: [MyEnum]) -> String {
var result = ""

// Without case conditions, we have to use a switch
for value in values {
switch value {
case let .C(str):
result += str
default:
break
}
}

// With a case condition, it's much simpler:
for case let .C(str) in values {
result += str
}

return result
}

实际上,您可以将案例条件与通常在 switch 中使用的几乎任何模式一起使用。 .有时会很奇怪:

  • if case let str as String = value { ... } (相当于 if let str = value as? String )
  • if case is String = value { ... } (相当于 if value is String )
  • if case 1...3 = value { ... } (相当于 if (1...3).contains(value)if 1...3 ~= value )

可选模式,又名 let x?

另一方面,可选模式是一种模式,除了简单的 if let 之外,它还允许您在上下文中解包可选值。 .在 switch 中使用时特别有用(类似于您的用户名/密码示例):

func doSomething(value: Int?) {
switch value {
//case 2: // Not allowed
case 2?:
print("found two")

case nil:
print("found nil")

case let x:
print("found a different number: \(x)")
}
}

关于swift - swift 2 中引入的可选模式有哪些优点/用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36880109/

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