差异微妙但很重要。Switch语句是一种根据特定情况将代码行分组的方法。然而,Switch表达式会根据特定情况返回一个值。
假设您有以下枚举类型...
enum SomeEnum {
case a
case b
case c
}
现在假设您需要根据特定的开关语句计算/返回一些值。目前,在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语句中,您必须在那里分配值。这是因为Switch语句不返回值。它只根据匹配的case/条件执行代码。(是的,您也可以将所有内容放在一个函数中,然后仅调用该函数,但这与此问题无关。)C# Switch Expression
相比之下,以下是使用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'在变量后面。此外,在大括号内,各个case之间用逗号隔开。最后,每个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,因为它可以让事情变得更容易/简单!