Objective C to Swift header file with multiple targets
我通过import语句成功地从目标C调用了我的swift类(针对目标"myapp"):
我现在创建了一个名为"myapplite"的新目标
当我编译新的目标时,我会得到错误,因为代码需要"myapp swift.h",但编译器正在创建"myapplite swift.h"。
因此,我需要为我编译的目标创建一个条件swift/objc头文件#import。
这是怎么做到的,还是有更好的办法?
也可以将Build Settings中的Product Module Name设置为在模块之间相同(我将其设置为$(PROJECT_NAME)),以便生成的-Swift.h文件在所有模块之间具有相同的名称。这样就不需要添加/检查预处理器宏。
- 终于开始测试了,谢谢,这对我很有用。
- 当您在项目中创建第一个Swift文件时,Xcode将要求您将桥接头添加到项目中。在我的例子中,它只向第一个构建目标添加了所需的配置。因此,我还需要通过配置Objective-C Bridging Header来修复其他构建目标。
- 我发现这导致了构建过程中的问题,在它们之间切换时,我需要清理构建文件夹。我相信,因为它们都共享相同的项目名称,所以它们都构建到相同的文件夹中。
- 我不确定,但我的感觉是,与Product Module Name的混乱会影响到以后的事情,可能是在提交到应用商店时;)…如另一个答案所述,更改Objective-C Generated Interface Header Name没有任何意义。
- @你刚刚看到你的评论。这是我最初的感觉,但应用程序已经在应用程序商店里有一段时间了,而且还没有成为一个问题。但如果我使用最新版本的Xcode,我会使用Mike Fay的解决方案tbh。这个答案是在SWIFT_MODULE_NAME可用之前作出的。
- 愿上帝保佑你!在所有目标中使用相同的模块名可以避免在混合swift/objc项目中使用自定义swift类时出现的蹩脚问题,这种情况只在版本构建中发生!!!!谢谢!
- iOS 11,魅力四射。说真的。谢谢您。
- @硼砂枪这个答案有点过时。我会按照Mike Fay的回答回答回答最新的Xcode版本
我发现解决这个问题的最佳方法是在Xcode共享项目设置中。可以搜索以下设置:
Objective-C生成的接口头名称*
如果将该值设置为通用头文件名,如"myproject swift.h",则该值将应用于每个目标,并且您可以在任何Objective-C文件中安全地使用导入声明。如果需要,这允许您继续为每个目标使用唯一的产品模块名称。
我在Xcode版本6.4(6e35b)中测试过这个。
*注意:这将显示在Swift编译器设置下,只有在项目中添加了Swift源文件时才可见。此外,如果目标没有任何关联的Swift源,那么对于该目标的构建设置,Swift编译器选项将不可见。
祝你好运!
- 这是我的最佳解决方案。
- 其原值为$(SWIFT_MODULE_NAME)-Swift.h…所以,虽然这个答案很好,但我想知道如何调整模块的SWIFT_MODULE_NAME。
- 当我在这里的时候,我建议使用一些明显的名字来减少混淆,例如,MidiDesignerAllTargets-Swift.h。感谢这个伟大的答案,这是一个伟大的发现。
- 如果您使用Xcode7+,这是最好的解决方案。
- Xcode 8.3.3中没有这个。
- 它在版本8.3.3(8E3004B)中仍然可用。
- @Antontropashko您需要选择显示/过滤All而不是Basic才能看到它。
如果您决定重新命名目标或项目,或者按预期使用SWIFT_MODULE_NAME,以前的答案会有一些问题。
最普遍的解决方案是在项目的而不是目标的构建设置下将SWIFT_OBJC_INTERFACE_HEADER_NAME(objective-c生成的接口头名称)更改为:
- $(PROJECT_NAME)-Swift.h—每个项目一个;
- $(SWIFT_MODULE_NAME)-Swift.h—每个模块一个(默认值)。
- 所有解决方案中最干净的一个。xcode 8.3.3,swift 3,确保公共/共享的swift文件属于每个目标,所有的工作都在这之后。
- 如何处理"$(项目名称)-swift.h文件未找到"类似警告的错误?
我将适当的import-swift.h语句放入为每个构建(目标/方案)定义/添加的前缀头文件(-prefix.pch)中。
- 这样做的好处是,可以更方便地在Objective-C中使用Swift类,并且在不需要显式导入头文件的Swift经验和Objective-C经验之间更加一致。
我唯一能解决的办法就是…
1 2 3 4 5
| #ifdef IS_LITE
#import"MyApp_Lite-Swift.h"
#else
#import"MyApp-Swift.h"
#endif |
请注意,如果我的产品模块名称中有任何"非法"字符,则需要用下划线替换它们。
希望有帮助!
- 这对我很有效,因为在目标之间切换时,公认的答案会导致构建问题。
唯一的工作方式是:1-从第一个目标(具有工作桥接)构建设置选择目标C桥接头2-复制目标C桥接头3-打开其他目标生成设置4 - Paste5-将头文件更改为新的头文件(即目标B.H)(现在您可以选择两个目标)