7

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

leachim
  • 167
  • 4
  • 12

2 Answers2

10

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("---")
}
OOPer
  • 47,149
  • 6
  • 107
  • 142
8

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
Ashley Mills
  • 50,474
  • 16
  • 129
  • 160