Objective C到Swift的头文件,包含多个目标。

13 浏览
0 Comments

Objective C到Swift的头文件,包含多个目标。

我已经成功地通过import语句从Objective C中调用我的Swift类(对于目标\'MyApp\')。我现在创建了一个名为\"MyAppLite\"的新目标。当我编译新目标时,出现错误,因为代码需要\"MyApp-Swift.h\",但编译器正在创建\"MyAppLite-Swift.h\"。因此,我需要为我正在编译的目标创建一个条件的Swift/ObjC头文件#import。如何实现这一点,或者是否有更好的方法?

0
0 Comments

Objective C到Swift头文件具有多个目标的问题的原因是,如果决定重命名目标或项目,或者按照预期使用SWIFT_MODULE_NAME,先前的答案存在一些问题。最通用的解决方案是在项目的构建设置下更改SWIFT_OBJC_INTERFACE_HEADER_NAME(“Objective-C Generated Interface Header Name”)为:

- $(PROJECT_NAME)-Swift.h - 每个项目一个;

- $(SWIFT_MODULE_NAME)-Swift.h - 每个模块一个(默认值)。

这是所有解决方案中最干净的解决方案。在Xcode 8.3.3和Swift 3中,确保公共/共享的Swift文件属于每个目标,此后所有的工作都会正常进行。

如何处理“$(PROJECT_NAME)-Swift.h文件未找到”错误,类似警告的问题?

这个答案应该被接受,因为它显示了更多的细节,尽管's的答案已经足够好了。

这就是我在寻找的。谢谢你的回答。

0
0 Comments

在Xcode的共享项目设置中,可以通过搜索以下设置来解决这个问题:

Objective-C Generated Interface Header Name

如果将该值设置为一个通用的头文件名,比如"MyProject-Swift.h",它将应用于每个目标,你可以在任何Objective-C文件中安全地使用import声明。这样,如果需要的话,你可以继续为每个目标使用唯一的产品模块名称。

我在Xcode Version 6.4 (6E35b)中进行了测试。

注意:这将出现在Swift编译器设置下,只有当您的项目中添加了Swift源文件时才可见。此外,如果一个目标没有任何与之关联的Swift源文件,那么该目标的构建设置中将看不到Swift编译器选项。

祝你好运!

这是我认为最好的解决方案。

初始值是$(SWIFT_MODULE_NAME)-Swift.h...所以虽然这个答案很棒,但我很想知道如何调整模块的SWIFT_MODULE_NAME。

顺便说一下,我建议使用一些明显的名称来减少混淆,比如MidiDesignerAllTargets-Swift.h。感谢这个很棒的答案,它是一个很好的发现。

如果你使用Xcode 7+,这是最好的解决方案。

在Version 8.3.3 (8E3004b)中,它仍然可用。

你需要选择显示/过滤全部,而不是基本,才能看到它。

0
0 Comments

Objective C to Swift header file with multiple targets的问题是在使用多个目标时,Objective-C转Swift的头文件的命名会出现问题。以下是问题出现的原因和解决方法:

问题的原因是当创建第一个Swift文件时,Xcode只会自动添加所需的配置到第一个构建目标中,而没有添加到其他构建目标中。这导致在构建过程中出现问题,并且在切换构建目标时需要清理构建文件夹。这是因为它们都共享相同的项目名称,它们都构建到同一个文件夹中。

解决方法是将所有模块的"Product Module Name"设置为相同的值(例如,设置为"$(PROJECT_NAME)"),这样生成的"-Swift.h"文件在所有模块中都具有相同的名称。这样就不需要添加/检查预处理器宏了。另外,需要通过配置"Objective-C Bridging Header"来修复其他构建目标。

至于"Product Module Name"的更改可能会在以后的一些地方产生影响,可能是在提交到App Store时。而根据其他答案中所描述的更改"Objective-C Generated Interface Header Name"没有任何影响。

值得注意的是,这个问题在最新版本的Xcode中可能已经得到解决,可以参考Mike Fay的解决方法。

总结一下,当在使用多个目标时,Objective-C转Swift的头文件命名会出现问题。解决方法是将所有模块的"Product Module Name"设置为相同的值,并通过配置"Objective-C Bridging Header"来修复其他构建目标。

0