【问题标题】:Objective C to Swift header file with multiple targets具有多个目标的 Objective C 到 Swift 头文件
【发布时间】:2014-12-03 09:59:16
【问题描述】:

我通过 import 语句成功地从 Objective C 调用了我的 Swift 类(用于目标“MyApp”):

#import "MyApp-Swift.h"

我现在创建了一个名为“MyAppLite”的新目标

当我编译新目标时,我收到错误,因为代码需要“MyApp-Swift.h”,但编译器正在创建“MyAppLite-Swift.h”

所以,我需要为我正在编译的目标创建一个有条件的 Swift/ObjC 标头 #import

如何做到这一点,或者有更好的方法吗?

【问题讨论】:

    标签: objective-c swift header-files target


    【解决方案1】:

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

    【讨论】:

    • 当您在项目中创建第一个 Swift 文件时,xcode 会要求您将桥接头添加到项目中。在我的情况下,它只将所需的配置添加到 first 构建目标。所以我还需要通过配置Objective-C Bridging Header 来修复其他构建目标
    • 我发现这会导致构建过程中出现问题,并且在它们之间切换时,我需要清理构建文件夹。我相信因为它们都共享相同的项目名称,所以它们都构建到同一个文件夹。
    • 我不确定,但我的感觉是,弄乱Product Module Name 会在以后影响某些事情,可能是在提交到 App Store 时;)...按照所述更改Objective-C Generated Interface Header Name在另一个答案中没有任何含义。
    • @Yar 刚刚看到你的评论。这是我最初的感觉,但该应用程序已经在 App Store 上架了一段时间,这不是问题。但如果我使用的是最新版本的 Xcode,我会使用 Mike Fay 的解决方案 tbh。这个答案是在SWIFT_MODULE_NAME 可用之前做出的。
    • 上帝保佑你!在我的所有目标中使用相同的模块名称使我免于在混合 Swift/ObjC 项目中使用自定义 swift 类的糟糕问题,该问题仅在发布版本中发生!!!非常感谢!
    【解决方案2】:

    我发现解决此问题的最佳方法是在您的 Xcode 共享项目设置中。您可以搜索以下设置:

    Objective-C 生成的接口头名称*

    如果您将该值设置为一个通用的标题名称,例如“MyProject-Swift.h”,它将应用于您的每个目标,并且您可以安全地在任何 Objective-C 文件中使用导入声明。如果需要,这允许您继续为每个目标使用唯一的产品模块名称。

    我已经在 Xcode 版本 6.4 (6E35b) 中对此进行了测试。

    *注意:这将出现在您的 Swift 编译器设置下,只有在您的项目中添加了 Swift 源文件时才可见。此外,如果目标没有任何关联的 Swift 源,则该目标的构建设置将看不到 Swift 编译器选项。

    祝你好运!

    【讨论】:

    • 这是 IMO 的最佳解决方案。
    • 这个的原始值是$(SWIFT_MODULE_NAME)-Swift.h...所以虽然这个答案很棒,但我喜欢知道如何调整模块的SWIFT_MODULE_NAME .
    • 当我在这里时,我建议使用一些明显的名称来减少混淆,例如,MidiDesignerAllTargets-Swift.h 感谢您提供这个出色的答案,这是一个很棒的 发现。
    • 如果您使用的是 Xcode 7+,这是最好的解决方案。
    • 它在 8.3.3 (8E3004b) 版本中绝对仍然可用。
    【解决方案3】:

    如果您决定重命名您的目标或项目,或者按预期使用SWIFT_MODULE_NAME,以前的答案会出现一些问题。

    最通用的解决方案是将Project's,而不是Targets,Build Settings下的SWIFT_OBJC_INTERFACE_HEADER_NAME(“Objective-C Generated Interface Header Name”)更改为:

    • $(PROJECT_NAME)-Swift.h — 每个项目一个;
    • $(SWIFT_MODULE_NAME)-Swift.h — 每个模块一个(默认值)。

    【讨论】:

    • 所有解决方案中最干净的。Xcode 8.3.3,Swift 3,确保公共/共享的 swift 文件属于每个目标,在此之后一切正常。
    • 如何处理“$(PROJECT_NAME)-Swift.h file not found”类似警告的错误?
    • 这应该被接受,因为它显示了更多细节,尽管@C0D3LIC1OU5 的回答很好
    • 这就是我要找的。谢谢你的回答。
    【解决方案4】:

    嗯,我能解决的唯一方法就是……

    #ifdef IS_LITE
    #import "MyApp_Lite-Swift.h"
    #else
    #import "MyApp-Swift.h"
    #endif
    

    请注意,如果我的产品模块名称中有任何“非法”字符,则需要将它们替换为下划线。

    希望有帮助!

    【讨论】:

    • 这对我有用,因为接受的答案在目标之间切换时会导致构建问题。
    • 什么是 IS_LITE?
    【解决方案5】:

    我将适当的#import -Swift.h 语句放在为每个构建(目标/方案)定义/添加的前缀头文件 (-Prefix.pch) 中。

    【讨论】:

    • 这样的好处是在 Objective-C 中使用 Swift 类更加方便,并且在不需要显式导入 headers 的 Swift 体验和 Objective-C 体验之间更加一致.
    【解决方案6】:

    唯一的工作方式如下:

    1- 从第一个目标(有一个有效的桥接)Build Setting 选择 Objective C Bridging Header
    2- 复制 Objective C 桥接头
    3- 打开另一个目标 Build Setting
    4-粘贴它 5-将头文件更改为新的头文件(即目标B.h)

    (现在你有两个目标的这个选项)

    【讨论】:

      【解决方案7】:

      精选会告诉你一切

      1. 第二个目标名称 xxx 和 xxx-ih

      1. 选择第一个目标点击build setting -> 找到Objective-C Bridging Header 设置xxx-bridging-Header.hObjective-C Generated Interface Header Name 设置xxx-Swift.h

      2. 选择第二个目标和相同的步骤2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 2017-01-13
        • 2016-11-20
        • 2014-07-28
        相关资源
        最近更新 更多