我通过import语句成功地从Objective C(针对目标' MyApp')调用我的Swift类:
#import "MyApp-Swift.h"
我现在创建了一个名为" MyAppLite"
的新目标当我编译新目标时,我会收到错误,因为" MyApp-Swift.h"代码需要,但编译器正在创建" MyAppLite-Swift.h"
所以,我需要为我编译的目标创建一个条件Swift / ObjC头#import
。
如何做到这一点,还是有更好的方法?
答案 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
- 每个模块一个(默认值)。答案 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)