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)
(现在你有两个目标这个选项)