Objective C to Swift包含多个目标的头文件

时间:2014-10-08 16:39:55

标签: objective-c swift header-files target

我通过import语句成功地从Objective C(针对目标' MyApp')调用我的Swift类:

#import "MyApp-Swift.h"

我现在创建了一个名为" MyAppLite"

的新目标

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

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

如何做到这一点,还是有更好的方法?

7 个答案:

答案 0 :(得分:72)

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

答案 1 :(得分:51)

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

Objective-C生成的界面标题名称*

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

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

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

祝你好运!

答案 2 :(得分:26)

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

最通用的解决方案是将项目下的SWIFT_OBJC_INTERFACE_HEADER_NAME(“Objective-C生成的接口标题名称”)更改为:

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

enter image description here

答案 3 :(得分:5)

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

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

请注意,如果有任何非法的&#39;在我的产品模块名称中,它们需要替换为下划线。

希望有所帮助!

答案 4 :(得分:5)

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

答案 5 :(得分:0)

唯一可行的方法如下:

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

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

答案 6 :(得分:0)

<块引用>

pickture 会告诉你一切

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

enter image description here

  1. 选择第一个目标点击build setting -> 找到Objective-C Bridging Header集合xxx-bridging-Header.hObjective-C Generated Interface Header Name集合xxx-Swift.h enter image description here

  2. 选择第二个目标和相同的步骤2 enter image description here