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

时间:2018-03-09 18:03:36

标签: swift enums switch-statement enumeration

如何使用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("")
}

简单问题:我希望借助Ironparent整数的值来处理案例nested(或任何特定情况)。

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

1 个答案:

答案 0 :(得分:5)

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

  1. 您的Nested1枚举案例与Nested1枚举名称不同。无论如何,枚举案件应以小写字母开头,以便于修复。

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

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

  4. 修复这些问题应该给你这个,打印"头盔"和" 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("")
    }