无论Swift中的情况如何,都从枚举中提取相关值

时间:2017-11-05 11:48:42

标签: swift enums

我想获取swift枚举对象的关联值,有没有办法比下面的switch语句更短/更好?

enum Test {
    case a(Int), b(Int), c(Int)
}

func printValue(_ t: Test) {
    switch t {
        case .a(let v), .b(let v), .c(let v): print("value \(v)")
    }
}

2 个答案:

答案 0 :(得分:3)

您从多个枚举中提取相关值的代码是最经济且易于阅读的,无需对其进行改进。

但是,无论enum的情况如何,您希望提取相关值这一事实表明您没有正确使用关联值:而不是将值与每个案例相关联,应创建一个复合类型,其中包含Intenum而没有关联值,即

enum Test {
    case a, b, c
}
class MyClass {
    var num : Int
    var tst : Test
}

现在相关的值是"在外面"每个enum元素,可以独立于案例进行访问,您也可以给它一个有意义的名称,这会增加程序的可读性。

答案 1 :(得分:-1)

您可能希望使用镜像类型 - 这不是更好的方法,但在某些情况下它可能会有所帮助:

enum Test {
    case a(Int), b(Int), c(Int)
}

func printValue(_ t: Test) {
    let mirror = Mirror(reflecting: t)
    print(mirror.children.first?.value ?? "")
}

printValue(.a(15))

同样使用if / case这样的情况,如果你只需要从一个案例中提取价值,这是一个较短的方法,有时它会有所帮助:

if case .a(let val) = t {
    print("value \(val)")
}

或者原始价值可能更适合您的情况:

enum Test: Int {
    case a = 1
    case b = 2
    case c = 5
}

func printValue(_ t: Test) {
    print("value \(t.rawValue)")
}

printValue(.a)