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

2023-11-27

考虑两个 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"

为什么打印一个案例@objcenum 打印枚举名称,同时打印case纯 Swift 枚举打印实际的case姓名?是否添加@objc更改枚举的调试描述?


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

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

  • @objc枚举被视为 C 兼容枚举
  • C 兼容枚举故意不发出用于反射的案例信息
  • 其他枚举确实会发出案例信息

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 @objc 枚举的描述与纯 Swift 枚举不同? 的相关文章

随机推荐

  • 当尝试使用 Jasmine 和 AngularJS 进行单元测试时,参数“fn”不是一个函数

    我正在尝试在 Angular 应用程序中使用 Jasmine 进行一些单元测试 但遇到了一些错误 Error Error injector modulerr Failed to instantiate module LocalStorage
  • 使用保留字时间戳作为字段名称(Firebird 2.5)

    除了 MSSQL 和 SQLite 之外 我还正在扩展现有应用程序的数据层以与 Firebird 2 5 配合使用 但我遇到了障碍 我有一个名为 TimeStamp 的字段 它将数据 时间存储为 TimeStamp 类型 这在类型为日期时间
  • WCF 服务作为 MVC 应用程序的一部分

    我有一个 MVC4 中的 Web 应用程序 我将主持一个共享主机提供者 我想用 WCF 服务来扩展它来上传文件 将有一个 WPF 桌面应用程序 允许用户直接从他们的 PC 上传文件 我宁愿以某种方式 一起 托管它 以避免对存储目录的读 写访
  • 正则表达式中`[.]`与`.`之间的差异

    下面的表达式并不相同 and 为什么会这样 它们究竟有何不同 之间有什么相互作用 以及正则表达式中的特殊字符 谢谢 The dot 通常是通配符 匹配任何字符 在一个字符类中 但是 它被视为文字并且仅匹配点
  • 如何创建覆盖 Windows 标题栏的 Java Swing 应用程序?

    我正在开发一个将用于心理学实验的 java swing 应用程序 研究人员要求我让该程序 黑屏 以便用户不会受到外界刺激 他们希望 Swing 应用程序能够真正全屏 并且顶部没有任何类型的标题栏或最小化 最大化 关闭按钮 该软件将在使用 J
  • 如何使用 AngularJS NgRoute 启动 MixItUp

    我一直在使用 AngularJS 设置一个 jquery 插件 MixItUp 虽然我可以在使用 NgRoute 的部分视图之一中成功启动容器 但一旦我移动到其他页面视图并返回 MixItUp 似乎不知道如何启动设置再次 我尝试过 docu
  • 选择列列表中至少有一个值不为空的行

    我有一个包含许多列 例如 1000 的大数据框 我有一个列列表 由脚本生成 10 我想选择原始数据框中的所有行 其中至少我的列列表之一不为空 因此 如果我提前知道列数 我可以这样做 list of cols col1 df df list
  • 如何使用其他命名空间中的对象以及如何在 PHP 中导入命名空间

    这两行之间的主要区别是什么 obj new ArrayObject obj new ArrayObject 当我使用第一行时 出现错误 Fatal error Class Foo Bar ArrayObject not found 我不太确
  • 正则表达式匹配可以基于两行文本吗?

    假设我有 def abc xyz abc 我想匹配 xyz abc 作为一个整体 使用最通用的正则表达式可以实现这一点吗 这不是具有多行标志的 perl RegEx 或 Net Regex 我猜应该是 BNF 来匹配这个 许多正则表达式实现
  • jCarousel:您可以删除所有项目并重新绑定到新集合吗?

    jCarousel 文档陈述如下 通过传递回调函数 itemLoadCallback 作为配置选项 您可以动态地create li 内容项 jCarousel 包含一个方便的方法 add 可以将项目的索引传递给create以及要创建的项目的
  • 如何按特定月份/日期过滤日期数据框?

    所以我的代码如下 df Dates df Dates index month 11 我正在做一个测试 看看是否可以过滤月份 以便它只显示 11 月日期 但这不起作用 它给我以下错误 AttributeError Int64Index 对象没
  • 调用 POST 方法后 Spring 控制器返回 404

    我有一个从 JQuery post 调用的 Spring 控制器 当它被调用时 控制器的方法被调用并返回 但随后 Spring 在后台更改 URL 并调用服务器增益 服务器响应 404 我认为这是对 Spring 在处理 POST 方法后尝
  • spring 3上传很多文件

    是的 我们的客户想要上传多个文件 我们使用 spring 3 mvc 官方的例子是这样的 markup
  • 如何在 WinRT 应用程序中获取实际语言?

    是否有可能像 Windows Phone 一样获取操作系统的实际语言 我在用着CultureInfo CurrentCulture TwoLetterIsoString 但我总是收到 en 而不是正确的语言 即de就我而言 那么如何获取 W
  • 如何在 Meteor 中访问客户端 IP 地址? [复制]

    这个问题在这里已经有答案了 这似乎是一个非常基本的问题 没有一个优雅的解决方案 答案 如何从 1 服务器或 2 客户端访问客户端 远程 IP 地址 获取客户端IP 如果没有 http 请求 在函数中您应该能够通过以下方式获取 clientI
  • 变量变量

    如何在 for 循环内创建可变变量 这是循环 for counter 1 counter lt aantalZitjesBestellen counter 在这个循环中 我想在每次通过时创建一个变量 seat 但它必须像这样递增 第一次通过
  • Travis CI 忽略 MAVEN_OPTS?

    我的 Scala 项目 Maven 管理的 无法在 Travis 上构建 抛出一个GC overhead limit exceeded尽管在本地用相同的方法编译得很好 但仍然出错MAVEN OPTS Xmx3g XX MaxPermSize
  • ASP.NET 自定义控件 - 仅包含一次嵌入 CSS 引用的最佳方法是什么?

    问题 我将 CSS 文件嵌入到具有多个控件的自定义控件库中 我想为所有控件共享相同的 CSS 文件 无论给定表单上有多少个控件实例 当表单上有多个控件时 我希望在 ASP NET 页面的 HTML 标头中恰好有 1 个对 CSS 文件的引用
  • jQuery - 删除所有具有相似名称的类

    有没有更好的方法来做到这一点 element removeClass class 1 removeClass class 2 removeClass class 3 removeClass class 5 to removeClass cl
  • 为什么 @objc 枚举的描述与纯 Swift 枚举不同?

    考虑两个 Swift 枚举 enum Foo Int case bar objc enum Baz Int case qux 如果我要print each case对于这些枚举 我期望得到相同的结果 相反 我看到了一些意想不到的东西 pri