我正在尝试在一个没有运气的混合 Swift 和 ObjectiveC 项目上工作。
我的项目由 6 个目标组成:
我已经能够添加一个 Swift 类,它具有一个目标成员资格(应用程序)并使用从 传递过来的 ObjectiveC 代码。 App-Bridging-Header.h
“ObjectiveC 到 Swift 代码”范式的作用就像一个魅力。
相反,我正在为“Swift 到 ObjectiveC 代码”的范式而苦苦挣扎。
在特定情况下,我需要在作为四个目标成员的 ObjectiveC .m 文件中使用新的 Swift 类。
到目前为止我一直在做的是:
我关注了 Mix and Match guide of Apple以及许多 SO 线程,包括 this one这似乎解决了我的同样问题,但它不起作用。
也看过this和 this但没有用。
还尝试过多次删除派生数据以及清理整个项目,但没有成功。
编辑 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 类并且这些多个目标使用 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/