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

时间:2017-02-28 15:56:40

标签: swift enums

考虑两个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 enum的大小写打印枚举名称,而打印纯粹的Swift枚举的case打印实际的case名称?添加@objc是否会更改枚举的调试说明?

1 个答案:

答案 0 :(得分:1)

这是因为@objc枚举是" C兼容的枚举",故意不会发出有关其案例的任何反映信息。

由于Swift是开源的,我们可以自己看看这个:

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

现在,如果你试图在Swift中声明一个复制原始值的枚举,那么你的手会受到打击并且编译错误。但是你应该能够通过在Obj / C中声明枚举然后通过桥将它导入Swift来创建这样的枚举。