(当我准备并几乎写完这个问题时,重新阅读适当的语言指南部分给我回答了,但可能问答对其他人有用,所以我还是会把它发出去。)
背景
考虑下面的enum
,其中有两种不同类型的关联值Int
或String
中的一种
enum Foo {
case bar(Int)
case baz(Int)
case bax(Int)
case fox(String)
}
在switch
语句中执行模式匹配时,我们可以构造复合案例,每个案例涵盖几个可能的匹配模式(如果有任何模式匹配,则进入case
分支):
func foo(_ foo: Foo) -> Int {
switch foo {
case .bar, .baz, .bax: return 42
case .fox: return 0
}
}
就像非复合案例一样,复合案例也可能包括价值约束:
func foo(_ foo: Foo) -> Int {
switch foo {
case .bar(let x), .baz(let x), .bax(let x): return x
case .fox(let y): return Int(y) ?? 0
}
}
// or
func foo(_ foo: Foo) -> Int {
switch foo {
case let .bar(x), let .baz(x), let .bax(x): return x
case let .fox(y): return Int(y) ?? 0
}
}
问题
enum
案例的复合?例如,在上面的后一个值绑定示例中,可以为复合case
中的公共类型关联值使用单个绑定功能。
// not valid
func foo(_ foo: Foo) -> Int {
switch foo {
case .bar, .baz, .bax, (let x): return x
case .fox: return 0
}
}
发布于 2016-12-20 13:54:42
不,这是不可能的;在上面的值绑定示例中,必须在每个模式中绑定x
,并且对于复合案例中的每个模式,这必须是分开的。
引用语言指南-控制流程 Quoting 的话
复合案例也可以包括值绑定。复合案例的所有模式都必须包含相同的值绑定,而每个绑定必须从复合case中的所有模式中获得相同类型的值。这确保了,无论复合大小写的哪一部分匹配,大小写主体中的代码始终可以访问绑定的值,并且该值始终具有相同的类型。
在上面的复合示例中,我们尝试省略其中一个模式中的绑定,在这个主题上,我们得到了一个不言自明的错误信息:
func foo(_ foo: Foo) -> Int {
switch foo {
case .bar(_), .baz(let x), .bax(let x): return x
case .fox: return 0
}
}
错误:必须在每个模式中绑定“X”
即使我们在下面的主体中不使用x
,这仍然有效。
func foo(_ foo: Foo) -> Int {
switch foo {
case .bar(_), .baz(let x), .bax(let x): return 0
case .fox: return 0
}
} // same error
https://stackoverflow.com/questions/41251872
复制相似问题