OC与Swift实现framework内混编
内容提要
这篇文章介绍了OC和Swift在framework内的混编实现方法。需要注意的地方有:将外部调用的OC头文件移动到public栏,并加入到Compile Source中;在framework内无法使用bridging-header文件,需要使用module.modulemap文件和umbrella header来完成Swift调用OC的功能;想要OC调用Swift,需要在Swift类上加上@objc和public修饰,并在OC文件中导入项目名-Swift.h文件。
延伸解读
Framework 内混编的关键限制
与普通 App 工程不同,Framework 内无法使用 bridging-header 文件,这是混编时最容易踩坑的地方。文章指出,Swift 调用 OC 必须依赖 module.modulemap 和 umbrella header 来构建模块,而 OC 调用 Swift 则依赖编译器自动生成的 -Swift.h 文件。理解这些限制,有助于在搭建混编环境时提前规划文件组织方式,避免因配置缺失导致编译失败。
Swift 调用 OC 的模块化配置
文章给出的做法是新建一个 .h 文件,用 #import 导入所有需要暴露的 OC 头文件,再在 module.modulemap 中通过 umbrella header 将该文件整体导出为模块。这样 Swift 文件只需 import 模块名即可访问 OC 代码。需要注意的是,单个头文件可用 header 导出,多个头文件则必须用 umbrella header,否则部分 OC 接口可能无法被 Swift 识别。
OC 调用 Swift 的修饰与头文件处理
要让 OC 访问 Swift 类,Swift 类必须同时加上 @objc 和 public 修饰,否则无法在 OC 中调用。此外,OC 文件需要导入自动生成的“项目名-Swift.h”头文件。文章提到作者采用从编译输出目录复制该文件到源码目录的取巧方式,并尝试用脚本自动复制但未成功。这种做法虽然可行,但可能带来维护上的不便,读者需留意其局限性。
Q&A
如何在OC和Swift的framework中实现混编?
需要将外部调用的OC头文件移动到public栏,并加入到Compile Source中,同时使用module.modulemap文件和umbrella header来实现Swift调用OC。
在framework中如何处理OC头文件?
OC头文件需移动到public栏,并在项目名.h文件中使用#import导入,同时新建一个.h文件以导入所有OC头文件。
Swift调用OC时需要注意哪些事项?
在framework中无法使用bridging-header文件,需使用module.modulemap文件和umbrella header来实现调用。
OC如何调用Swift类?
Swift类必须加上@objc和public修饰,并在OC文件中导入项目名-Swift.h文件。
如何解决-Swift.h文件的导入问题?
可以通过复制编译输出的-Swift.h文件到源代码目录来解决导入问题。
module.modulemap文件的作用是什么?
module.modulemap文件用于定义模块,使得Swift能够调用OC头文件,特别是在无法使用bridging-header的情况下。