【问题标题】:ModuleName-Swift.h file not found in xcode8在 xcode8 中找不到 ModuleName-Swift.h 文件
【发布时间】:2017-03-21 22:56:09
【问题描述】:

我正在尝试处理一个混合的 Swift 和 ObjectiveC 项目,但没有运气。

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

  • 应用
  • 核心
  • 核心测试
  • 总结
  • WatchKit 扩展
  • WatchKit 应用程序

我已经能够添加一个具有一个目标成员资格 (App) 并使用从 App-Bridging-Header.h 传递的 ObjectiveC 代码的 Swift 类 “将 ObjectiveC 转换为 Swift 代码”范式就像是一种魅力。

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

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

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

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

也见过thisthis,但没用。

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

编辑 1:更多细节

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

@objc class MyClass: Object {}

这是ObjectiveC中Swift类的使用sn-p

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_NAMEMODULE_NAME

编辑 3:进口

这是 .m ObjectiveC 文件中 Swift 标头的导入集。 我正在使用相关构建设置属性中指定的模块名称。请注意,由于 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 文件的交叉可见性

我尝试了以下方法:

  • 仅在目标 App 中添加了 Swift 类
  • XCode 创建了桥接头
  • 在 ObjectiveC 文件中插入了#import "ProjectName_App-Swift.h",仅供 App 使用
  • 在这个文件中使用了 Swift 类
  • 它编译!而且我可以使用 Swift 类

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

我做错了什么? 感谢您的帮助

【问题讨论】:

  • 你能编辑你导入 Swift 生成的标头的方式吗?
  • @Sealos 将导入添加到原始问题
  • 我相信您在标头导入中缺少项目名称。你介意检查一下吗?像这样:“Project_name_WatchKit_Extension-Swift.h” 另外,您可以检查文件在 swift 文件中执行 SomeClass.classForKeyedUnarchiver 的模块并获取它。
  • 我相信你说的是真的,你不能将其他目标快速导入到不同的目标中。您需要做的是将 Swift 文件添加到目标成员资格(例如:i.stack.imgur.com/v3Z0A.jpg)。那应该可以解决您的问题!
  • @Sealos 谢谢,我发现它与我在编辑 4 中发现的问题有关,我首先尝试了您的解决方案,但没有成功。不过谢谢你帮助我

标签: ios objective-c swift xcode xcode8


【解决方案1】:

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

因此,必须采用一种解决方案,即更改 SWIFT_OBJC_INTERFACE_HEADER_NAME 构建设置并使其在不同目标之间保持相同。 为此,将生成此属性的指令从 $(SWIFT_MODULE_NAME)-Swift.h 更改为 $(PROJECT_NAME)-Swift.h,如 here

所述>

还可以将 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

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

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"

您应该看到每个目标都有一个标题

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

您在 .m 文件顶部的确切位置#import 隐藏的桥接头可以产生影响。问题的常见迹象是您收到“未知类型名称”编译错误,其中未知类型是在 Objective-C 中声明的类。解决方案是在 #import 隐藏桥接头之前 #import 包含 Objective-C 文件中未知类型声明的 .h 文件。必须这样做可能会很烦人,特别是如果有问题的 Objective-C 文件不需要知道这个类,但它解决了问题并允许继续编译。

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

【讨论】:

  • @Hiren 您是否尝试过从终端使用此命令查找 Swift 头文件?找到 ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"
  • 如果您有更多目标,请不要忘记为所有目标制作 Bridging-Header。它在我的项目中工作
  • 光荣的救世主!正是我的问题和解决方案!谢谢你,先生。
  • find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h" not found,如何生成?
  • 我已经执行了你的命令find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"并得到了显示文件已生成的响应,但xcode一直在抱怨找不到文件。我有两种风格的应用程序,这个错误是唯一一个失败的构建并浪费我的时间。有什么建议。谢谢。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢。奇怪的是,我构建了我的单个 Swift 文件,它编译得很好(就像以前每次都做的那样),但它随后生成了我的 xxx-Swift.h 文件,该文件现在出现在 Xcode 的“4 square”按钮的包含列表中工具栏。这是向前迈出的一大步,因为我现在可以构建和运行我的应用程序。现在的问题是另一个 .m 源无法编译,因为它找不到 xxx-Swift.h 文件!
【解决方案3】:

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

#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>

【讨论】:

  • 这就是在lib里面导入lib的“...-Swift.h”的解决方案。谢谢大佬!
  • 我遇到了混合 Swift 和 Objective-C 的静态库的问题。此问题已通过此解决方案解决。谢谢!
【解决方案4】:

我遇到了类似的问题,几乎最终花了一整天的时间来解决这个问题,同时遵循 StackOverflow 上其他开发人员的建议和其他一些来源。

我正在从 Xcode 7.3.1 升级到 Xcode 8.2.1,从 Swift 2.2 升级到 Swift 3.0.1。
就我而言,我发现PROJECT_NAME-Swift.h 文件不是在以下位置创建的:

~/Library/Developer/Xcode/DerivedData/PRODUCT-NAME-hdkrxixrxbiorwesffpqvefxsrzl/Build/Intermediates/PRODUCT-NAME.build/Debug/PRODUCT-NAME.build/Objects-normal/x86_64/PRODUCT-NAME-Swift.h.

我猜它以某种方式尝试从上述路径引用此头文件,因此出现错误。我手动复制了它。在此之后没有进行干净的构建。 这解决了我的问题,并开始创建 swift 头文件以供进一步编译和构建。

【讨论】:

  • 不好意思,请您帮忙理解一下:您是在哪里手动复制的?
【解决方案5】:

在我的例子中,我在 .h 文件中声明了 import 语句

那我换

#import "ProjectName_App-Swift.h"

进入实现文件(.m)

清理并重新启动 Xcode 工作

【讨论】:

    【解决方案6】:

    就我而言,它在 Xcode 8 中运行良好,但带有

    的文件
    #import "Project-Swift.h"
    

    如 LucioB 所述,缺少导入

    使用 Xcode 9 可以消除这些错误

    【讨论】:

      【解决方案7】:

      我在一个有iOS ApplicationSubModule Framework 的项目中遇到了这个问题,

      问题发生在我将框架构建配置改为 RELEASE 时

      【讨论】:

        【解决方案8】:

        如果此页面上建议的解决方案都不起作用,最好检查一下框架目标中的配置。如果您在主应用程序中创建自定义配置,您希望在框架目标中也存在相同的配置。如果这些不匹配,可能会导致 Xcode 无法找到正确的构建设置,因此无法找到正确的头文件。

        【讨论】:

          【解决方案9】:

          就我而言,我有一个包含 iOS 应用程序子项目、框架子项目和 CocoaPods Pods 子项目的工作区。我的框架子项目中出现“ModuleName-Swift.h 文件未找到”错误,因为该文件尚未由 Pods 子项目创建。

          我不确定是否有办法告诉 Xcode 子项目之间的依赖关系,但我只是在左侧的 Project Navigator 中重新排序:

          1. 豆荚
          2. 框架
          3. iOS 应用

          在那之后工作得很好!

          【讨论】:

            【解决方案10】:

            我在一个模块化应用程序中开发,-Swift.h 是 ModuleName-Swift.h

            我删除了派生数据,清理了构建文件夹,重新启动了我的 mac,但解决的是:

            pod cache clean ModuleName
            

            之后

            run pod update ModuleName
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-27
              • 1970-01-01
              • 1970-01-01
              • 2015-10-11
              • 1970-01-01
              相关资源
              最近更新 更多