Swift:带有 switch 语句的嵌套枚举

Swift: Nested enum with switch statement

如何使用 switch-case 处理嵌套枚举?

我有以下枚举:

enum Parent: Int {

    enum Nested1: Int {
        case Bow
        case Sword
        case Lance
        case Dagger
    }
    enum Nested2: Int {
        case Wooden
        case Iron
        case Diamond
    }

    //case Nested1  -- Not allowed
    //case Nested2  -- Not allowed
    case Case3
    case Case4
    case Case5

}

switch-case如何处理?

我有两个用于父枚举和嵌套枚举案例的整数变量。

let parent = 1
let nested = 2

我正在尝试以下方法但失败了(下面的代码不起作用)。

let parentCase =  Parent(rawValue: parent)

switch parentCase {
case .Nested1:
    print("Weapon")

case .Nested2:
    print("Helmet")
    let nestedCase = Parent.Nested2(rawValue: nested)

    switch nestedCase {
    case .Wooden:
        print("Weapon")

    case .Iron:
        print("Iron")

    case .Diamond:
        print("Diamond")

    default:
        print("")
    }

default:
    print("")
}

简单问题:我想在 parentnested 整数值的帮助下达到案例 Iron(或任何特定案例)。

或者有没有更好的方法来定义嵌套枚举,可以用 switch-case 轻松处理?

您的方法会奏效,只是您的实施存在一些问题。这种方法是否是最好的方法是一个不同的问题,这取决于您的要求。如果可能的话,我会切换到具有父级关联值的枚举。

  1. 您的 Nested1 枚举案例不能与您的 Nested1 枚举同名。枚举大小写无论如何都应该以小写字母开头,所以这很容易修复。

  2. 具有 Int 原始值的枚举的案例默认从 0 开始,但您希望第一个案例映射到 1,因此您需要明确说明。

  3. 用原始值初始化一个枚举returns一个可选的,所以你应该在打开它之前打开那个可选的。

解决这些问题应该会给你这个,打印 "Helmet" 和 "Iron":

enum Parent: Int {

    enum Nested1: Int {
        case bow = 1
        case sword
        case lance
        case dagger
    }

    enum Nested2: Int {
        case wooden = 1
        case iron
        case diamond
    }

    case nested1 = 1
    case nested2
    case case3
    case case4
    case case5

}

let parent = 2
let nested = 2

guard let parentCase = Parent(rawValue: parent) else {
    // Do something to handle invalid enum case here
    fatalError()
}

switch parentCase {
case .nested1:
    print("Weapon")

case .nested2:
    print("Helmet")
    guard let nestedCase = Parent.Nested2(rawValue: nested) else {
        // Do something to handle invalid enum case here
        break
    }

    switch nestedCase {
    case .wooden:
        print("Weapon")

    case .iron:
        print("Iron")

    case .diamond:
        print("Diamond")

    default:
        print("")
    }

default:
    print("")
}