leachim
leachim

Reputation: 332

How to get the name of an enumeration case by its raw value in Swift 4?

Using Xcode 9.4.1 and Swift 4.1

Having an enumeration with multiple cases from type Int, how can I print the case name by its rawValue?

public enum TestEnum : UInt16{
case ONE    = 0x6E71
case TWO    = 0x0002
case THREE  = 0x0000
}

I am accessing the Enum by the rawValue:

print("\nCommand Type = 0x" + String(format:"%02X", someObject.getTestEnum.rawValue))
/*this prints: Command Type = 0x6E71
if the given Integer value from someObject.TestEnum is 28273*/

Now I additionally want to print "ONE" after the HEX value.

I am aware of the Question: How to get the name of enumeration value in Swift? but this is something different because I want to determine the case name by the cases raw value instead of the enumeration value by itself.

Desired Output:

Command Type = 0x6E71, ONE

Upvotes: 7

Views: 6785

Answers (2)

OOPer
OOPer

Reputation: 47896

You can create an enum value from its rawValue and get its case String using String.init(describing:).

public enum TestEnum : UInt16 {
    case ONE    = 0x6E71
    case TWO    = 0x0002
    case THREE  = 0x0000
}

let enumRawValue: UInt16 = 0x6E71

if let enumValue = TestEnum(rawValue: enumRawValue) {
    print(String(describing: enumValue)) //-> ONE
} else {
    print("---")
}

Upvotes: 10

Ashley Mills
Ashley Mills

Reputation: 53181

You can't get the case name as as String as the enum's type isn't String, so you'll need to add a method to return it yourself…

public enum TestEnum: UInt16, CustomStringConvertible {
    case ONE = 0x6E71
    case TWO = 0x0002
    case THREE = 0x0000

    public var description: String {
        let value = String(format:"%02X", rawValue)
        return "Command Type = 0x" + value + ", \(name)"
    }

    private var name: String {
        switch self {
        case .ONE: return "ONE"
        case .TWO: return "TWO"
        case .THREE: return "THREE"
        }
    }
}

print(TestEnum.ONE)

// Command Type = 0x6E71, ONE

Upvotes: 8

Related Questions