【发布时间】:2023-01-22 00:54:20
【问题描述】:
希望通过这个标题,很明显我不是在问 Swift 是否支持 Switch 语句。我特意问一下 Swift 是否支持 Switch表达式,类似于 C# 所具有的。
区别很微妙,但很重要。 Switch 语句是一种根据特定情况对代码行进行分组的方法。然而,一个 Switch 表达式返回一个值基于一个特定的案例。
假设您有以下枚举...
enum SomeEnum {
case a
case b
case c
}
现在假设您需要根据特定的 switch 语句计算/返回一些值。目前,在 Swift 中你必须使用 Switch陈述去做这个...
let someEnumValue: SomeEnum = .a
let result: String
switch someEnumValue {
case .binary: result = "This is the 'A' type"
case .octal: result = "This is the 'B' type"
case .hexadecimal: result = "This is the 'C' type"
}
print(result)
//prints 'This is the 'A' type'
正如你在上面看到的,在 Swift 中,你必须首先声明 let result: String 但是不是给它一个值,然后在 Switch 中陈述,你必须在那里分配价值。这是因为一个开关陈述不返回值。它仅根据匹配的案例/条件执行代码。 (是的,您也可以将所有这些放在一个函数中并简单地调用它,但这与这个问题是分开的。)
C# 开关表达式
相比之下,这是使用 Switch 在 C# 中编写它的方式表达...
var result = someEnum switch {
SomeEnum.a => "This is the 'A' type",
SomeEnum.b => "This is the 'B' type",
SomeEnum.c => "This is the 'C' type"
}
Console.WriteLine(result)
//prints 'This is the 'A' type'
正如您在此处看到的,Switch 表达式直接将值赋给result 变量,因为 Switch 表达式会返回一个值。
注意:与 Switch 语句不同,在 Switch 表达式中,单词“switch”出现在变量之前,单词 switch 出现后变量。此外,在大括号内,各个案例用逗号分隔。最后,每个 case 只能是一个产生值的表达式。除非先将复合语句包装在它们自己的函数中,否则不能运行复合语句。
带闭包的伪版本
我的一位同事想出了这种使用就地闭包的方法。它好一点,但仍然不如真正的 Switch 表达式那么简单......
let result = { switch someEnum { case .a: return "This is the 'A' type" case .b: return "This is the 'B' type" case .c: return "This is the 'C' type" } }() print(result)所以我的问题很简单……Swift 支持 Switch 表达式吗?如果没有,让我们把它推荐给Swift.org,因为它让事情变得更容易/更简单!
【问题讨论】:
标签: swift switch-statement switch-expression