从枚举中提取关联值,而不考虑Swift中的大小写

从枚举中提取关联值,而不考虑Swift中的大小写,swift,enums,Swift,Enums,我想获得swift enum对象的关联值,有没有比下面的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)") } } 从多个枚举中提取关联值的代码是最经济且易于阅读的,无需改进 但是,不管enum

我想获得swift enum对象的关联值,有没有比下面的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)")
    }
}

从多个枚举中提取关联值的代码是最经济且易于阅读的,无需改进

但是,不管
enum
的大小写如何,您都希望提取关联的值,这表明您没有正确使用关联的值:而不是将值与每个单独的大小写关联,您应该创建一个复合类型,其中包含
Int
enum
,而不包含关联的值,即

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

既然关联的值在每个
enum
元素的“外部”,就可以独立于大小写来访问它,您也可以给它一个有意义的名称,这会增加程序的可读性。

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

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)

我同意。不幸的是,枚举来自第三方库,因此我无法控制它。@frangulyan
enum
在代码外部可能是首先使用此代码的唯一有效原因。仅供参考,如果你能想到他们的决定背后的原因——我猜Facebook的解析团队在开源之前就在代码背后。请注意,你不应该依赖每个案例都有关联值或具有相同类型的关联值。虽然现在可能是这样,特别是当您与外部库交互时,将来可能会发生变化。关联值的全部要点是允许不同类型和不同情况。如果控制枚举的一方决定添加一个案例,编译器将警告您没有该类型的案例。第二个示例不是关联的value@paper1111是的,不是,我只是建议另一种方法。不,没有