为什么@objc枚举与纯Swift枚举有不同的描述?

JAL*_*JAL 8 enums swift

考虑两个Swift枚举:

enum Foo: Int {
    case bar
}

@objc enum Baz: Int {
    case qux
}
Run Code Online (Sandbox Code Playgroud)

如果我对print每个case枚举都这样,我会期待相同的结果.相反,我看到一些意外的事情:

print(Foo.bar) // "bar\n"
print(Baz.qux) // "Baz\n"
Run Code Online (Sandbox Code Playgroud)

为什么打印@objc枚举的情况打印枚举名称,而打印case纯粹的Swift枚举打印实际case名称?添加是否会@objc更改枚举的调试说明?

Jer*_*man 2

这是因为@objc枚举是“C 兼容枚举”,它们故意不发出有关其情况的任何反射信息。

由于 Swift 是开源的,我们可以亲自观察一下:

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

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