【问题标题】:Getting String name of Objective-C @objc enum value in Swift?在 Swift 中获取 Objective-C @objc 枚举值的字符串名称?
【发布时间】:2016-11-27 12:08:33
【问题描述】:

如果一个 Objective-C 函数返回一个带有枚举的状态值,有没有办法在 Swift 中获取枚举的字符串?

same question 被问及原生 Swift 枚举案例,但在这个问题中,我专门使用 @objc enum Objective-C enums in Swift

如果我这样做 debugPrint("\(status)")print("\(status)") 我只会得到枚举的名称而不是值。

如果我执行status.rawValue,我会得到 int,但解释起来没有多大意义。

【问题讨论】:

    标签: swift objective-c


    【解决方案1】:

    您还可以将 Obj-C 枚举的一致性添加到 CustomStringConvertible 并以这种方式将值转换为字符串。只要您不使用default,如果这些值在未来版本中发生任何更改,您都会收到警告。

    例如:

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

    【讨论】:

    • 从 Swift 5 开始,您必须添加 @unknown default(例如 fatalError())以避免出现警告。如果开关不是详尽无遗的,您仍然可以获得被警告的优势,但添加它会使编译器满意。
    【解决方案2】:

    Objective-C enum case 的名称在运行时不存在——它们只是整数值,与 Swift 的 enums 不同,后者具有与它们相关联的运行时信息。如果您想在运行时获得各个案例的名称,则必须单独存储它们并通过整数值访问它们(即从 int 值转换为人类可识别的名称)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 2015-08-09
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多