一、前言
一般老项目多多少少都会存留上古 OC 代码或者只有 OC 版本的第三方库。
所以不管怎么操作,大都免不了混编的操作。
在此本文主要记录如何在 Swift Package 中使用 OC 代码,以达到在组件化过程中,实现 OC 代码复用的效果。
本文例子基础代码来自这篇文章《Swift Package 制作笔记》的 demo,如有需要,可自行大概浏览了解。
二、添加 OC 代码并对外使用
2.1 制作 OC Target
在 MyLibrary 下创建 OCLib 文件夹,并创建 include、Code 两个文件夹作为 OCLib 的子文件夹。
在Core目录中创建一个名为 OCTarget 的 OC 文件,并将 OCTarget.h 文件移动到 include 中。
include 文件夹 = 设置 Public 的地方,在里面的头文件相关的类都会被设置为 Public 方式,并对外暴露。
OC 代码创建测试方法,便于测试集成情况。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface OCTarget : NSObject
-(void)sayHello;
@end
NS_ASSUME_NONNULL_END
#import "OCTarget.h"
@implementation OCTarget
-(void)sayHello {
NSLog(@"hello OCTarget");
}
@end
回到 Package.swift 中,制作 OC Target。
2.2 将新的 OC Target 集成到主工程测试
主工程添加 TargetOC 依赖
ViewController 中使用 OC 组件代码。
至此,Swift Package 中添加 OC 代码并对外使用的方式完成。
三、Swift 代码调用 OC 代码
打开 Package.swift,并对 TargetA 添加 OC Target 依赖。
在 TargetA.swift 中设置初始化的时候调用 OC 代码。
再 ViewController 中注释掉 OC 的调用方式,并运行。
至此,Swift Package 中 Swift 代码调用 OC 代码完成。
同理,OC 代码也可以这么调用 Swift 代码,这里就不展开记录了。
三、OC 代码调用私有 OC 代码
3.1 创建私有的 OC 代码。
再 OCLib 文件夹下创建 Private 文件夹,并创建一个名为 PrivateOC OC代码文件。
PrivateOC 代码创建测试方法,便于测试集成情况。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface PrivateOC : NSObject
-(void)sayHello;
@end
NS_ASSUME_NONNULL_END
#import "PrivateOC.h"
@implementation PrivateOC
-(void)sayHello {
NSLog(@"hello PrivateOC");
}
@end
回到 Package.swift 中修改配置文件。
打开 OCTarget.m 文件,并添加 PrivateOC.h 以及使用相关测试方法。
回到 ViewController 中运行。
扩展:PrivateOC 并不会被其它依赖文件所能使用,这样子就可以达到 OC 私有化操作了。
至此,Swift Package 中 OC 代码调用 OC 代码完成。
四、再 include 中使用替身。
include 是我们设置 OC 代码为 Public 的方式,但如果将每个需要 public 的 OC 头文件都移动到 include 中,多多少少看起来会有些割裂。
这个时候我们可以使用软连接的方式(ln -s)进行替身操作,现将当前 include 总的头文件移到对应 .m 文件处。
打开终端并进入 include 文件夹,创建替身。
回到工程,我们会发现替身直接出现在了工程中。
重新运行主工程,成功运行。
至此,再 include 中使用替身完成。