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

Fit*_*rst 64 objective-c header-files target swift

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

#import "MyApp-Swift.h"
Run Code Online (Sandbox Code Playgroud)

我现在创建了一个名为"MyAppLite"的新目标

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

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

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

C0D*_*OU5 78

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

  • 我不确定,但我的感觉是,弄乱"产品模块名称"会影响以后的某些事情,可能是在提交到App Store时;)......如上所述更改`Objective-C Generated Interface Header Name`在另一个答案中没有任何影响. (8认同)
  • @Yar刚看到您的评论。最初是我的感觉,但是该应用程序已经在App Store中存在了一段时间,这并不是问题。但是,如果我使用的是最新版本的Xcode,则应使用Mike Fay的解决方案tbh。这个答案是在“ SWIFT_MODULE_NAME”可用之前做出的。 (2认同)

Mik*_*Fay 57

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

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

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

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

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

祝好运!

  • 这是IMO的最佳解决方案. (2认同)
  • 这个的原始值是`$(SWIFT_MODULE_NAME)-Swift.h` ...所以虽然这个答案很棒,但我很乐意*知道如何调整模块的`SWIFT_MODULE_NAME`. (2认同)

Dmi*_*aev 31

如果您决定重命名目标或项目,或者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 文件属于每个目标,在此之后一切正常。 (2认同)

Fit*_*rst 5

好吧,我唯一可以解决的方法是...

#ifdef IS_LITE
#import "MyApp_Lite-Swift.h"
#else
#import "MyApp-Swift.h"
#endif
Run Code Online (Sandbox Code Playgroud)

请注意,如果我的产品模块名称中包含“非法”字符,则需要将它们替换为下划线。

希望有帮助!


小智 5

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