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

Luc*_*ioB 30 xcode objective-c ios swift xcode8

我正在努力研究一个混合的Swift和ObjectiveC项目而没有运气.

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

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

我已经能够添加一个具有一个目标成员资格(App)的Swift类,并使用从App-Bridging-Header.h传递的ObjectiveC代码 ."ObjectiveC into Swift code"范例就像一个魅力.

相反,我正在努力解决"Swift into ObjectiveC code"范式.在特定情况下,我需要在ObjectiveC .m文件中使用一个新的Swift类,该文件是四个目标的成员.

到目前为止我一直在做的是:

  1. 将新的Swift文件添加到Core项目,指定四个成员资格(App,Core,Summary,WatchKit Ext)
  2. XCode要求为三个项目创建-Bridging-Header.h Core,Summary和WatchKit Ext(App-Bridging-Header.h已经存在,因为之前已经使用过),我同意(不知道为什么它会在里面创建这些文件)我添加我的Swift类的同一组文件夹但是没关系)
  3. 我创建了Swift类,在前添加了@objc
  4. 我去检查是否为所有模块设置了Objective-C Generated Interface Header Name,是的
  5. 我去检查所有模块中的Defines Module是否设置为No,并在主项目中设置为Yes,是的
  6. 我写下了所有四个目标的-Swift.h文件的导入
  7. 在我的Objective-C类中,我尝试使用我的新Swift类,显然它似乎工作(甚至自动完成)
  8. 我尝试构建项目,但它没有说没有找到-Swift.h文件

我已经按照Apple混合和匹配指南和许多SO线程,包括这个似乎显然是为了解决我的同样问题,但它不起作用.

也见过这个这个但是没有用.

还尝试过删除派生数据以及多次清理整个项目而没有运气.

编辑1:更多细节

这是我的Swift类导入RealmSwift的声明

@objc class MyClass: Object {}
Run Code Online (Sandbox Code Playgroud)

这是在ObjectiveC中使用Swift类的片段

MyClass *app = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)

如果我避免使用#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 Settings属性中指定的模块名称.请注意,由于WatchKit Extension目标在目标名称中有空格,因此其中包含'_'字符.

#import "ProjectName_App-Swift.h"
#import "ProjectName_Core-Swift.h"
#import "ProjectName_Summary-Swift.h"
#import "ProjectName_WatchKit_Extension-Swift.h"
Run Code Online (Sandbox Code Playgroud)

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

我尝试过以下方法:

  • 仅在目标应用程序中添加了Swift类
  • XCode创建了Bridging Header
  • 在ObjectiveC文件中插入#import"ProjectName_App-Swift.h"仅由App使用
  • 在这个文件中使用了Swift类
  • 它汇编!我可以使用Swift类

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

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

Luc*_*ioB 48

我在编辑4中做出的假设证明是正确的.如果项目有多个目标,则无法在一个.m ObjectiveC文件中导入"-Swift.h"文件.

因此,必须采用一种解决方案,即更改SWIFT_OBJC_INTERFACE_HEADER_NAME构建设置并使其在不同目标中保持相同.要做到这一点改变,产生从这个属性的指令$(SWIFT_MODULE_NAME)-Swift.h$(PROJECT_NAME)-Swift.h作为解释这里

也可以将Build Settings中的Product Module Name设置在模块中设置为相同(我将其设置为$(PROJECT_NAME)),以便生成的-Swift.h文件在所有模块中具有相同的名称.这消除了添加/检查预处理器宏的需要.

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

如果在构建之后仍然显示错误,请确保通过Cmd单击其名称可以从XCode到达标头.它应该打开一个包含类似于此代码的文件:

SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)

如果需要确保生成这些标头,请打开终端并使用此命令

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"
Run Code Online (Sandbox Code Playgroud)

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

在这些更改之后发生在我身上的另一个问题是它开始在我没有触及的ObjectiveC代码上给出错误.这个问题是由于进口的位置,据报道在这里:

确切地说,在.m文件的顶部你#import隐藏的桥接头可以有所作为.通常的麻烦的迹象是你得到一个"未知类型名称"编译错误,其中未知类型是在Objective-C中声明的类.解决方案是在#import隐藏的桥接头之前,#import导入包含Objective-C文件中未知类型声明的.h文件.必须这样做可能会令人烦恼,特别是如果有问题的Objective-C文件不需要知道这个类,但它解决了问题并允许继续编译.

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


cor*_*rnr 7

我的解决方案是通过<>语法导入生成的swift头:

#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>
Run Code Online (Sandbox Code Playgroud)


Jen*_*ens 7

这不是问题的解决方案,但由于许多人可能最终在此页面上寻找<ModuleName>-Swift.h找不到文件的问题(就像我一样),我想补充一个可能的原因:

当swift文件中存在编译器问题时,Xcode可能无法生成标头,因此文件丢失.

至少在我的情况下,<ModuleName>-Swift.h not found一旦我修复了Swift文件中的编译错误,它就消失了.


归档时间:

查看次数:

34674 次

最近记录:

7 年,3 月 前