ios - 在 xcode8 中找不到 ModuleName-Swift.h 文件

标签 ios objective-c swift xcode xcode8

我正在尝试在一个没有运气的混合 Swift 和 ObjectiveC 项目上工作。

我的项目由 6 个目标组成:

  • 应用
  • 核心
  • 核心测试
  • 摘要
  • WatchKit 扩展
  • WatchKit 应用程序

  • 我已经能够添加一个 Swift 类,它具有一个目标成员资格(应用程序)并使用从 传递过来的 ObjectiveC 代码。 App-Bridging-Header.h
    “ObjectiveC 到 Swift 代码”范式的作用就像一个魅力。

    相反,我正在为“Swift 到 ObjectiveC 代码”的范式而苦苦挣扎。
    在特定情况下,我需要在作为四个目标成员的 ObjectiveC .m 文件中使用新的 Swift 类。

    到目前为止我一直在做的是:
  • 向 Core 项目添加一个新的 Swift 文件,指定四个成员身份(App、Core、Summary、WatchKit Ext)
  • XCode 要求创建 -Bridging-Header.h 对于三个项目 Core、Summary 和 WatchKit Ext(App-Bridging-Header.h 已经存在,因为它以前使用过),我同意(不知道为什么它会在我添加 Swift 类的同一个组文件夹中创建这些文件但没关系)
  • 我创建了 Swift 类,并添加了 @objc 之前的 key 类(class)
  • 我去看看 Objective-C 生成的接口(interface)头名称 为所有模块设置,是的,它是
  • 我去看看定义模块 设置为 在所有模块中并设置为 在主项目中,是的,它是
  • 我写下了 的导入-Swift.h 所有四个目标的文件
  • 在我的 Objective-C 类中,我尝试使用我的新 Swift 类,显然它似乎可以工作(甚至自动完成)
  • 我尝试构建该项目,但没有说 -Swift.h 找不到文件

  • 我关注了 Mix and Match guide of Apple以及许多 SO 线程,包括 this one这似乎解决了我的同样问题,但它不起作用。

    也看过thisthis但没有用。

    还尝试过多次删除派生数据以及清理整个项目,但没有成功。

    编辑 1:更多细节

    这是我的 Swift 类的声明
    导入 RealmSwift
    @objc class MyClass: Object {}
    

    这是ObjectiveC中Swift类的使用片段
    MyClass *app = [[MyClass alloc] init];
    

    如果我避免使用 #import ...-Swift.h 构建失败,说我正在使用一个未声明的标识符“MyClass”,这是合理的。

    如果我确实使用 #import ...-Swift.h 文件,它会说模块 X 找不到模块 Y 等等。

    编辑 2:Swift 模块名称

    通过查看 SWIFT_OBJC_INTERFACE_HEADER_NAME 我见过的每个目标的属性都是使用这种语法构建的 $(SWIFT_MODULE_NAME)-Swift.h 我需要改变吗 SWIFT_MODULE_NAME MODULE_NAME ?

    编辑 3:进口

    这是 .m ObjectiveC 文件中 Swift 头文件的导入集。
    我正在使用相关build设置属性中指定的模块名称。请注意,因为 WatchKit 扩展目标在目标名称中有一个空格,所以一个有 '_' 字符。
    #import "ProjectName_App-Swift.h"
    #import "ProjectName_Core-Swift.h"
    #import "ProjectName_Summary-Swift.h"
    #import "ProjectName_WatchKit_Extension-Swift.h"
    

    编辑 4:-Swift.h 文件的交叉可见性

    我尝试了以下方法:
  • 仅在目标应用程序中添加了 Swift 类
  • XCode 创建了桥接头
  • 在仅由应用程序使用的 ObjectiveC 文件中插入 #import "ProjectName_App-Swift.h"
  • 在此文件中使用了 Swift 类
  • 它编译!我可以使用 Swift 类

  • 当为多个目标定义 Swift 类并且这些多个目标使用 ObjectiveC 文件时,它不起作用。构建错误是这样的:找不到目标 X -> "ProjectName_TargetY-Swift.h"文件。
    似乎一个目标看不到其他目标 -Swift.h 文件。

    我究竟做错了什么?
    谢谢你的帮助

    最佳答案

    我在 Edit 4 中所做的假设结果证明是正确的。
    如果一个项目有多个目标,则无法将“-Swift.h”文件全部导入到一个 .m ObjectiveC 文件中。

    所以必须采用一种解决方案,那就是改变 SWIFT_OBJC_INTERFACE_HEADER_NAME build设置并使其在不同目标上相同。
    为此,请更改生成此属性的指令 $(SWIFT_MODULE_NAME)-Swift.h $(PROJECT_NAME)-Swift.h 如解释 here

    It is also possible to set the Product Module Name setting in Build Settings to be the same across your modules (I set it to $(PROJECT_NAME)), so that the -Swift.h file that is generated has the same name across all modules. This eliminates the need for adding/checking preprocessor macros.



    通过按 Alt 并进入产品菜单完成此清理构建文件夹后。由于 header 的名称现在在目标之间共享,因此可以在 .m ObjectiveC 文件中导入一次,并且所有目标都可以从 Swift 类中受益。

    如果构建后仍然显示错误,请确保可以通过 Cmd 单击其名称从 XCode 访问标题。它应该打开一个包含类似于以下代码的文件:
    SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
    @interface MyClass : NSObject
    - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
    @end
    

    如果需要确保生成这些 header ,请打开终端并使用此命令
    find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"
    

    您应该为每个目标看到一个标题

    在这些更改之后发生在我身上的另一个问题是它开始在我没有触及的 ObjectiveC 代码上给出错误。问题是由于导入的位置,如报告 here :

    Exactly where at the top of a .m file you #import the hidden bridging header can make a difference. The usual sign of trouble is that you get an “Unknown type name” compile error, where the unknown type is a class declared in Objective-C. The solution is to #import the .h file containing the declaration for the unknown type in your Objective-C files as well, before you #import the hidden bridging header. Having to do this can be an annoyance, especially if the Objective-C file in question has no need to know about this class, but it resolves the issue and allows compilation to proceed.



    最后,代码编译并在设备和模拟器上运行!

    关于ios - 在 xcode8 中找不到 ModuleName-Swift.h 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40484816/

    相关文章:

    ios - 使用 AFNetworking 丢失网络连接问题

    iphone - 调用 [tableView reloadData];在 modalViewController 的 viewController 上

    ios - Codable 错误 - 预期解码 Dictionary <String, Any> 但找到数组

    ios - 单击单元格时如何根据排序移动单元格?

    ios - 如何使用 NSURLAuthenticationMethodservertrust 触发 URLAuthenticationChallenge

    ios - 在 UITextField 上向左滑动手势

    ios - Swift 中的外观代理 (iOS)

    swift - 从 github 克隆后,Xcode 项目工作区丢失文件

    ios - 快速具有多个部分的 TableView

    php - 如何从 onesignal 发送推送通知,设备 ID 存储在数据库中 - cordova 应用程序