如何声明允许 "flattened" `switch` 语句的 `enum` 的 `enum`?

How to declare an `enum` of `enum` that allows for "flattened" `switch` statement?

Optional in Swift 允许魔术,其中 switch-ing 可选 enum 将案例扁平化为单个 switch 语句。

给定:

enum Foo {
    case bar, baz
}

您可以:

let foo: Foo? = .bar
switch foo {
case .bar:
    break
case .baz:
    break
case nil:
    break

这里,Optional是一个enumFoo是一个enum,但是只要一个语句就足以涵盖两者的所有情况。

问题:我可以在另一个 enum 中声明自己的 enum 以便案件也能以扁平的方式处理吗?

这样我就可以:

enum Foo<Bar> {
    case nope
    case dope(Bar)
}

enum Baz {
    case yep
}

let b: Foo<Baz> = .dope(.yep)

switch b {
case .nope:
    break
case .yep:
    break
}

也许如果我将案例 Foo.dope 称为 Foo.some?也许有我可以使用的注释?

你可以用……

switch b {
case .nope: // stuff
case .dope(.yep): // other stuff
case .dope(.someOtherCase): // more stuff
}

正在回复您的评论…

想象一下,你可以像你说的那样把它弄平。你会如何处理...

enum Foo {
    case a
    case b(Bar)
    case c(Bar)
}

如果允许从开关中排除 .b,则无法区分 .b.c