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

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类,该文

我正在尝试一个混合了Swift和ObjectiveC的项目,但运气不好

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

  • 应用程序
  • 核心
  • 岩心测试
  • 总结
  • 手表套件分机
  • WatchKit应用程序
我已经能够添加一个Swift类,该类具有一个目标成员身份(App),并使用从应用桥接头传递的Objective代码。h “ObjectiveC转化为快速代码”的范例工作起来很有魅力

相反,我正在与“快速转换为ObjectiveC代码”范式斗争。 在特定情况下,我需要在Objective.m文件中使用一个新的Swift类,该文件是四个目标的成员

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

  • 向核心项目添加一个新的Swift文件,指定四个成员身份(应用程序、核心、摘要、WatchKit-Ext)
  • XCode要求为三个项目创建-bridge Header.h核心、摘要和WatchKit Ext(App bridge Header.h自从以前使用以来就已经存在),我同意(不知道为什么它会在我添加Swift类的同一个组文件夹中创建这些文件,但不同意)
  • 我在类之前添加@objc键来创建Swift类
  • 我去检查是否为所有模块设置了Objective-C生成的接口头名称,是的
  • 我去检查是否在所有模块中将定义模块设置为,并在主项目中将其设置为,是的
  • 我记录了所有四个目标的-Swift.h文件的导入
  • 在我的Objective-C类中,我尝试使用我的新Swift类,显然它似乎有效(甚至自动完成)
  • 我尝试构建该项目,但失败的原因是未找到-Swift.h文件
  • 我已经遵循了许多线程,包括似乎解决了我的同一个问题,但它不工作

    也看到了,但没有起作用

    我也曾多次尝试删除派生数据以及清理整个项目,但都没有成功

    编辑1:更多详细信息

    这是我的Swift班级宣言 导入RealmSwift

    @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类
    当为多个目标定义Swift类,并且这些多个目标使用ObjectiveC文件时,它将不起作用。生成错误如下:未找到目标X->“ProjectName\u TargetY-Swift.h”文件。 似乎一个目标看不到其他目标-Swift.h文件

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

    我在编辑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