在Swift 3中获取ObjC枚举的名称?

时间:2016-11-27 12:08:34

标签: objective-c swift3

如果ObjC函数返回带枚举的状态值,是否可以在Swift 3中获取枚举的字符串?如果我debugPrint("\(status)")print("\(status)")我只是获取枚举的名称而不是值。如果我做status.rawValue,我会得到int,但这并不意味着解释。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您还可以将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"
        }
    }
}

答案 2 :(得分:2)

如果print(x)为您提供了所需内容,请使用String(describing:)。这几乎总是正确的答案。 (一般来说,这相当于"\(x)"。它们不一定相同,但我还没有发现它们不存在的情况。)如果只有debugPrint()给你你想要什么,然后使用String(reflecting:)

对这些结果要非常小心。它们没有本地化,也没有承诺在版本之间保持一致。它们不是序列化API。他们没有承诺可以通过反转来为您提供原始数据。这些枚举方法的输出在Swift 3中发生了巨大的变化。我绝对希望它们能够再次改变,因为基金会对Swift进一步改进。

我不想过度吓唬你这些方法。 String(describing:)很好地定义了它在某些情况下返回的内容(特别是实现某些协议的自定义类型),但并非在所有情况下都是如此。你必须阅读文档,并对它有合理的谨慎。另一方面,String(reflecting:)明确地“适合于调试”。我不会赌这个字符串。