【问题标题】:Why does an @objc enum have a different description than a pure Swift enum?为什么@objc 枚举与纯 Swift 枚举有不同的描述?
【发布时间】:2017-02-28 15:56:39
【问题描述】:

考虑两个 Swift 枚举:

enum Foo: Int {
    case bar
}

@objc enum Baz: Int {
    case qux
}

如果我要 print 这些枚举中的每个 case,我会期待相同的结果。相反,我看到了一些意想不到的东西:

print(Foo.bar) // "bar\n"
print(Baz.qux) // "Baz\n"

为什么打印 @objc 枚举的大小写会打印枚举名称,而打印纯 Swift 枚举的 case 会打印实际的 case 名称?添加@objc会改变枚举的调试描述吗?

【问题讨论】:

  • Swift 枚举比 ObjC 枚举携带更多元数据(案例标签)。 ObjC 枚举只是一系列 int,并不真正了解它们所代表的案例标签。您可以通过打开枚举并返回不同的字符串来解决它:stackoverflow.com/a/14651888/3141234
  • @Alexander 非常感谢!这对我来说终于有点道理了。我以为我快疯了,因为我看到的所有帖子都表明在 Swift 中打印枚举会显示这种情况,即使我清楚地看到了一个不是这种情况的示例(CBCentralManagerState)。谢谢!
  • 如果调试器打印枚举案例的rawValue而不是枚举的名称会更有用...

标签: swift enums


【解决方案1】:

那是因为@objc 枚举是“C 兼容的枚举”,它有意不发出任何关于其案例的反射信息。

由于 Swift 是开源的,我们可以四处看看:

这是“为什么”的一个版本,以实施为中心。现在,让我们退一步问,为什么要这样实现?emitCaseNames 函数对 C 兼容枚举的注释解释了这一点:C 兼容枚举不保证从枚举原始值映射回标签,因为与 Swift 原生枚举不同,它们可以有多个 case,它们都具有相同的原始值。

现在,如果您尝试在 Swift 中声明一个重复原始值的枚举,您将受到打击并出现编译器错误。但是您应该能够通过在 Obj/C 中声明枚举然后通过桥将其导入 Swift 来创建这样的枚举。

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多