Objective C将Swift头文件转换成多个目标

我通过导入语句成功地从Objective C(针对“MyApp”目标)调用Swift类:

#import "MyApp-Swift.h" 

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

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

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

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

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

我发现解决这个问题的最好办法是在你的Xcode共享项目设置中。 您可以search以下设置:

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

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

我已经在Xcode版本6.4(6E35b)中testing过了。

*注意:这将出现在您的Swift编译器设置下,这些设置仅在您将Swift源文件添加到项目中时才可见。 此外,如果一个目标没有任何与之相关的Swift源代码,Swift编译器选项对于该目标的构build设置将不可见。

祝你好运!

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

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

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

在这里输入图像说明

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

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

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

希望有所帮助!

我将相应的#import <project> -Swift.h语句放入为每个构build(target / scheme)定义/添加的前缀头文件(<project> -Prefix.pch)中。

唯一的工作方式如下:

1-从第一个目标(它有一个工作桥接) 生成设置select目标C桥接头
2-复制目标C桥接头
3-打开另一个目标生成设置
4-粘贴它5-将头文件更改为新的头文件(即目标Bh)

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