12

If an Objective-C function returns a status value with enum, is there a way to get the string of the enum in Swift?

The same question is asked of native Swift enumeration cases, but in this question I am specifically working with @objc enum Objective-C enums in Swift:

If I do debugPrint("\(status)") or print("\(status)") I just get the name of the enum instead of value.

If I do status.rawValue, I get the int, but it doesn't mean much to interpret.

pkamb
  • 33,281
  • 23
  • 160
  • 191
jl303
  • 1,461
  • 15
  • 27

2 Answers2

13

You can also add conformance of the Obj-C enum to CustomStringConvertible and translate values to strings that way. As long as you don't use default you will be warned if any of these values change in future versions.

For example:

extension NSLayoutAttribute : CustomStringConvertible {
    public var description: String {
        switch self {
        case .left : return "left"
        case .right : return "right"
        case .top : return "top"
        case .bottom : return "bottom"
        case .leading : return "leading"
        case .trailing : return "trailing"
        case .width : return "width"
        case .height : return "height"
        case .centerX : return "centerX"
        case .centerY : return "centerY"
        case .lastBaseline : return "lastBaseline"
        case .firstBaseline : return "firstBaseline"
        case .leftMargin : return "leftMargin"
        case .rightMargin : return "rightMargin"
        case .topMargin : return "topMargin"
        case .bottomMargin : return "bottomMargin"
        case .leadingMargin : return "leadingMargin"
        case .trailingMargin : return "trailingMargin"
        case .centerXWithinMargins : return "centerXWithinMargins"
        case .centerYWithinMargins : return "centerYWithinMargins"
        case .notAnAttribute : return "notAnAttribute"
        }
    }
}
David James
  • 2,430
  • 1
  • 26
  • 35
  • 1
    As of Swift 5 you must add `@unknown default` (with `fatalError()` for example) to avoid a warning. You still get the advantage of being warned if the switch is not exhaustive but adding this will make the compiler happy. – David James May 15 '20 at 13:28
10

The names of Objective-C enum cases do not exist at runtime — they are simply integer values, unlike Swift's enums, which have runtime information associated with them. If you want the names of the individual cases at runtime, you will have to store them separately and access them via the integer values (i.e. translate from the int value to a human-recognizable name).

Itai Ferber
  • 28,308
  • 5
  • 77
  • 83