【问题标题】:Bulk fix hundreds of "#selector not exposed to Objective-C" errors in Xcode 9 or 9.1批量修复 Xcode 9 或 9.1 中的数百个“#selector not暴露于Objective-C”错误
【发布时间】:2017-11-09 20:22:29
【问题描述】:

Adding '@objc' to expose this instance method to Objective-C有什么方法可以一次修复多个错误,我实际上有超过200个这样的错误,在我修复了大约70个错误之后,如果一个一个做这个就累坏了。

我尝试在issue navigator 中选择多个这些错误,但一次没有看到Fix 的方式。

我看到的唯一方法是一次选择一个错误并点击Fix,哦,这太恶心了,如果你知道任何方法,请帮忙。

【问题讨论】:

    标签: swift xcode swift4 xcode9


    【解决方案1】:

    您需要运行迁移器——在 Xcode 中转到“编辑 > 转换 > 到当前 Swift 语法...”,然后为“Swift 4 @objc 推理”选项选择“最小化推理”(我实际上没有直到最近才意识到迁移器所做的大部分工作只是自动应用编译器修复程序)。

    如果您已经在 Swift 4 目标中,您将无法在其上运行迁移。您可以通过将该目标的“Swift Language Version”构建设置更改为“Swift 3.2”,然后在其上运行迁移器(这会将版本切换回 4)来解决此问题。

    迁移器运行后,您会注意到“Swift 3 @objc inference”构建设置已设置为“开启”——您需要使用此构建设置测试您的程序,以确保您没有获取有关未标记为 @objc 的 Obj-C 入口点的任何运行时警告,然后在完成后将构建设置更改为“默认”,如 in this Q&A 所述。

    此外,在迁移之后,请随意查看添加了 @objc 的位置 - 您可以通过使用给定类的单个 @objc extension 定义一组方法来整理代码想要暴露给 Obj-C。如果您正在查看一个要求其兼容成员所有 暴露 Obj-C 的类,那么您可以标记该类@objcMembers。有关更多信息,请参阅this Q&A

    【讨论】:

    • 非常有帮助,目标已经移至 Swift 4,因此将“Swift Language Version”构建设置更改为“Swift 3.2”并运行迁移器工作,谢谢!
    【解决方案2】:

    您可以在整个类或结构上使用@objcMembers 属性。 您需要选择要应用 @objcMembers 属性的类。

    你可以关注this tutorial

    根据Apple doc

    当 Swift 类引入许多需要来自 Objective-C 运行时的行为的新方法或属性时,请在该类的声明中使用 @objcMembers 属性。将@objcMembers 属性应用于类会隐式地将@objc 属性添加到其所有与Objective-C 兼容的成员中。因为应用@objc 属性会增加应用程序的编译大小并对性能产生不利影响,所以只有在每个成员都需要应用@objc 属性时才在声明中应用@objcMembers 属性。

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 2016-08-17
      • 1970-01-01
      • 2017-11-06
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 2012-03-14
      相关资源
      最近更新 更多