2017-02-28 97 views
6

考虑两个斯威夫特枚举:为什么@objc枚举与纯粹的Swift枚举有不同的描述?

enum Foo: Int { 
    case bar 
} 

@objc enum Baz: Int { 
    case qux 
} 

如果我每个printcase这些枚举的,我希望同样的结果。相反,我看到一些意外:

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

为什么印刷@objc枚举的情况下打印枚举名字,在打印纯斯威夫特枚举的case打印的实际case名字?添加@objc是否更改枚举的调试描述?

+5

Swift枚举携带比ObjC更多的元数据(case标签)。 ObjC枚举只是一系列的int,并没有真正了解它们所代表的案例标签。你可以通过打开枚举来解决它,并返回不同的字符串:http://stackoverflow.com/a/14651888/3141234 – Alexander

+0

@Alexander非常感谢你!这终于对我产生了某种意义。我以为我疯了,因为我见过的所有帖子都表明,在Swift中打印枚举会显示案例,尽管我清楚地看到了一个不是这种情况的例子(CBCentralManagerState)。谢谢! – vegather

回答

0

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

由于雨燕是开源的,我们可以鼻子周围看到这样的自己:

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

现在,如果您尝试在Swift中声明一个重复原始值的枚举值,那么您将得到您的手掌和编译器错误。但是你应该能够通过在Obj/C中声明枚举然后通过桥将它导入Swift来创建这样的枚举。