具有多个目标的 Objective C 到 Swift 头文件

问题描述 投票:0回答:8

我通过 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
8个回答
98
投票

也可以将

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


69
投票

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

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

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

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

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

祝你好运!


53
投票

如果您决定重命名目标或项目,或按预期使用

SWIFT_MODULE_NAME
,则之前的答案会存在一些问题。

最通用的解决方案是将项目而不是目标、构建设置下的

SWIFT_OBJC_INTERFACE_HEADER_NAME
(“Objective-C 生成的接口标头名称”)更改为:

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

enter image description here


5
投票

好吧,我能解决的唯一方法就是......

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

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

希望有帮助!


5
投票

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


1
投票

pickture告诉你一切

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

enter image description here

  1. 选择第一个目标点击

    build setting
    -> 查找
    Objective-C Bridging Header
    设置
    xxx-bridging-Header.h
    Objective-C Generated Interface Header Name
    设置
    xxx-Swift.h
    enter image description here

  2. 选择第二个目标并执行相同的步骤

    2
    enter image description here


0
投票

唯一的工作方式如下:

1-从第一个目标(具有有效的桥接)构建设置选择Objective C桥接标题
2- 复制 Objective C 桥接头
3-打开另一个目标构建设置
4-粘贴 5-将头文件更改为新的头文件(即目标B.h)

(现在您可以选择两个目标)


0
投票

还要检查“Swift Compiler - General”下的 SWIFT_INSTALL_OBJC_HEADER 为 YES。它的默认值应该是 YES,bug 默认是 NO。 🤷

config

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.