考虑两个 Swift 枚举:
enum Foo: Int {
case bar
}
@objc enum Baz: Int {
case qux
}
如果我要print
each case
对于这些枚举,我期望得到相同的结果。相反,我看到了一些意想不到的东西:
print(Foo.bar) // "bar\n"
print(Baz.qux) // "Baz\n"
为什么打印一个案例@objc
enum 打印枚举名称,同时打印case
纯 Swift 枚举打印实际的case
姓名?是否添加@objc
更改枚举的调试描述?
那是因为@objc
枚举是“C 兼容枚举”,它们故意不发出有关其情况的任何反射信息。
由于 Swift 是开源的,我们可以亲自观察一下:
- @objc枚举被视为 C 兼容枚举
- C 兼容枚举故意不发出用于反射的案例信息
- 其他枚举确实会发出案例信息
这是“为什么”的一种版本,注重实施。现在,让我们退一步问,为什么要这样实施?评论者是emitCaseNames
C 兼容枚举的函数解释了这一点:C 兼容枚举不保证从枚举原始值映射回标签,因为与 Swift 原生枚举不同,它们可以有多个具有相同原始值的情况价值。
现在,如果您尝试在 Swift 中声明一个重复原始值的枚举,您将会遇到麻烦并出现编译器错误。但是您应该能够通过在 Obj/C 中声明枚举然后通过桥将其导入到 Swift 中来创建这样的枚举。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)