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

Kru*_*nal 1 enums enumeration switch-statement swift

如何使用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

}
Run Code Online (Sandbox Code Playgroud)

我怎么能用它来处理它switch-case.

对于父枚举和嵌套枚举,我有两个整数变量.

let parent = 1
let nested = 2
Run Code Online (Sandbox Code Playgroud)

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

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("")
}
Run Code Online (Sandbox Code Playgroud)

简单的问题:我希望Iron借助于值parentnested整数来达到案例(或任何特定情况).

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

dan*_*dan 5

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

  1. 您的Nested1枚举案例不能与Nested1枚举名称相同.无论如何,枚举案例应以小写字母开头,因此很容易修复.

  2. 具有Int原始值的枚举的情况默认情况下从0开始,但是您希望第一种情况映射到1,因此您需要明确说明.

  3. 使用原始值初始化枚举将返回一个可选项,因此您应该在打开它之前解开该可选项.

修复这些问题应该给你这个,打印"头盔"和"铁":

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("")
}
Run Code Online (Sandbox Code Playgroud)