考虑两个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
是否会更改枚举的调试说明?
答案 0 :(得分:1)
这是因为@objc
枚举是" C兼容的枚举",故意不会发出有关其案例的任何反映信息。
由于Swift是开源的,我们可以自己看看这个:
@objc
enums are treated as C-compatible enums 这是"为什么"的一个版本,以实施为重点。现在,让我们退一步并问一下,为什么以这种方式实现? emitCaseNames
函数对C兼容枚举的注释解释了这一点:C兼容枚举不保证从枚举原始值到标记的映射,因为与Swift原生枚举不同,它们可以有多个具有相同原始值的情况。
现在,如果你试图在Swift中声明一个复制原始值的枚举,那么你的手会受到打击并且编译错误。但是你应该能够通过在Obj / C中声明枚举然后通过桥将它导入Swift来创建这样的枚举。