frangulyan
frangulyan

Reputation: 3847

Extract associated value from enum regardless of the case in Swift

I want to get the associated value of swift enum object, is there a way to do it shorter/better than in switch statement below?

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)")
    }
}

Upvotes: 3

Views: 1232

Answers (2)

Alex Shubin
Alex Shubin

Reputation: 3617

You might want to use mirror type - it's not the better way, but it can be helpful in some cases:

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))

Also using if/case like this, it's a shorter way if you need to extract value only from one case, sometimes it's helpful:

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

Or may be raw value will fit better for your case:

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

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

printValue(.a)

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726509

Your code for extracting the associated value from multiple enums is the most economical and easy-to-read, there's no need to improve it.

However, the fact that you are looking to extract an associated value regardless of enum's case suggests that you are not using associated values correctly: rather than associating a value with each individual case, you should create a composite type that holds the Int and an enum without an associated value, i.e.

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

Now that the associated value is "outside" each enum element, it can be accessed independently of the case, and you can also give it a meaningful name, which adds to readability of your program.

Upvotes: 3

Related Questions