第二章 Swift Package 中使用 OC 代码

1,483 阅读2分钟

一、前言

一般老项目多多少少都会存留上古 OC 代码或者只有 OC 版本的第三方库。

所以不管怎么操作,大都免不了混编的操作。

在此本文主要记录如何在 Swift Package 中使用 OC 代码,以达到在组件化过程中,实现 OC 代码复用的效果。

本文例子基础代码来自这篇文章《Swift Package 制作笔记》的 demo,如有需要,可自行大概浏览了解。

二、添加 OC 代码并对外使用

2.1 制作 OC Target

在 MyLibrary 下创建 OCLib 文件夹,并创建 include、Code 两个文件夹作为 OCLib 的子文件夹。

image.png

在Core目录中创建一个名为 OCTarget 的 OC 文件,并将 OCTarget.h 文件移动到 include 中。

include 文件夹 = 设置 Public 的地方,在里面的头文件相关的类都会被设置为 Public 方式,并对外暴露。

image.png

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。

image.png

2.2 将新的 OC Target 集成到主工程测试

主工程添加 TargetOC 依赖

image.png

ViewController 中使用 OC 组件代码。

image.png

至此,Swift Package 中添加 OC 代码并对外使用的方式完成。

三、Swift 代码调用 OC 代码

打开 Package.swift,并对 TargetA 添加 OC Target 依赖。

image.png

在 TargetA.swift 中设置初始化的时候调用 OC 代码。

image.png

再 ViewController 中注释掉 OC 的调用方式,并运行。

image.png

至此,Swift Package 中 Swift 代码调用 OC 代码完成。

同理,OC 代码也可以这么调用 Swift 代码,这里就不展开记录了。

三、OC 代码调用私有 OC 代码

3.1 创建私有的 OC 代码。

再 OCLib 文件夹下创建 Private 文件夹,并创建一个名为 PrivateOC OC代码文件。

image.png

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 中修改配置文件。

image.png

打开 OCTarget.m 文件,并添加 PrivateOC.h 以及使用相关测试方法。

image.png

回到 ViewController 中运行。

image.png

扩展:PrivateOC 并不会被其它依赖文件所能使用,这样子就可以达到 OC 私有化操作了。

image.png

至此,Swift Package 中 OC 代码调用 OC 代码完成。

四、再 include 中使用替身。

include 是我们设置 OC 代码为 Public 的方式,但如果将每个需要 public 的 OC 头文件都移动到 include 中,多多少少看起来会有些割裂。

image.png

这个时候我们可以使用软连接的方式(ln -s)进行替身操作,现将当前 include 总的头文件移到对应 .m 文件处。

image.png

打开终端并进入 include 文件夹,创建替身。

image.png

回到工程,我们会发现替身直接出现在了工程中。

image.png

重新运行主工程,成功运行。

image.png

至此,再 include 中使用替身完成。