Ios 在xcode8中找不到ModuleName Swift.h文件
我正在尝试一个混合了Swift和ObjectiveC的项目,但运气不好 我的项目由6个目标组成:Ios 在xcode8中找不到ModuleName Swift.h文件,ios,objective-c,swift,xcode,xcode8,Ios,Objective C,Swift,Xcode,Xcode8,我正在尝试一个混合了Swift和ObjectiveC的项目,但运气不好 我的项目由6个目标组成: 应用程序 核心 岩心测试 总结 手表套件分机 WatchKit应用程序 我已经能够添加一个Swift类,该类具有一个目标成员身份(App),并使用从应用桥接头传递的Objective代码。h “ObjectiveC转化为快速代码”的范例工作起来很有魅力 相反,我正在与“快速转换为ObjectiveC代码”范式斗争。 在特定情况下,我需要在Objective.m文件中使用一个新的Swift类,该文
- 应用程序
- 核心
- 岩心测试
- 总结
- 手表套件分机
- WatchKit应用程序
@objc class MyClass: Object {}
这是Objective中Swift类的用法片段
MyClass *app = [[MyClass alloc] init];
如果我避免使用#import…-Swift.h,那么构建会失败,因为我使用了一个未声明的idenfier“MyClass”,这是正确的
如果我使用#import…-Swift.h文件,它会说模块X找不到模块Y等等
编辑2:Swift模块名称
通过查看每个目标的SWIFT\u OBJC\u INTERFACE\u HEADER\u NAME属性,我发现它是使用以下语法构建的$(SWIFT\u MODULE\u NAME)-SWIFT.h我是否需要将SWIFT\u MODULE\u NAME更改为MODULE\u NAME
编辑3:导入
这是.m ObjectiveC文件中Swift头的导入集。
我正在使用相对生成设置属性中指定的模块名称。请注意,由于WatchKit扩展目标在目标名称中有一个空格,因此其中有一个字符为“uu”
#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创建了桥接头
- 在Objective文件中插入#导入“ProjectName_App-Swift.h”,该文件仅由应用程序使用
- 在此文件中使用了Swift类
- 它编译!我能使用Swift类
谢谢你的帮助我在编辑4中所做的假设是正确的。 如果一个项目有多个目标,“-Swift.h”文件不能全部导入到一个.m ObjectiveC文件中 因此,必须采用一种解决方案,即更改SWIFT\u OBJC\u INTERFACE\u HEADER\u NAME构建设置,并使其在不同的目标之间保持一致。 要执行此操作,请将生成此属性的指令从$(SWIFT\u模块\u名称)-SWIFT.h更改为$(项目\u名称)-SWIFT.h,如前所述 还可以在构建设置中将产品模块名称设置设置为跨模块相同(我将其设置为$(PROJECT_Name)),以便生成的-Swift.h文件跨所有模块具有相同的名称。这样就不需要添加/检查预处理器宏 完成此操作后,按Alt键并进入“产品”菜单,清理生成文件夹。由于标头的名称在目标之间共享,现在可以在.m ObjectiveC文件中导入一次,所有目标都可以受益于Swift类 如果构建后仍然显示错误,请确保可以通过Cmd单击标题的名称从XCode访问标题。它应该打开一个包含类似以下代码的文件:
SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
如果需要确保生成这些标头,请打开终端并使用此命令
find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"
您应该看到每个目标都有一个标题
在这些更改之后发生在我身上的另一个问题是,它开始在ObjectiveC代码上出现错误,而我并没有触及这些错误。如报告所述,问题是由于进口的状况造成的:
在.m文件顶部导入隐藏桥接头的确切位置可能会有所不同。问题的常见迹象是出现“未知类型名称”编译错误,其中未知类型是在Objective-C中声明的类。解决方法是#导入包含Objective-C文件中未知类型声明的.h文件,然后再#导入隐藏的桥接头。有
#import "Project-Swift.h"
#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>
#import "ProjectName_App-Swift.h"
pod cache clean ModuleName
run pod update ModuleName