OC和Swift混合开发(Pod私有库的相互引用)

环境 Xcode 12.4, Swift:5.0

概述:该文档主要介绍OC和Swift混合开发相互调用,包括3大类情况和12种具体情形。

三大类情况:

  1. 主工程内的混合互调,

  2. 主工程和Pod三方库之间的混合互调,

  3. Pod三方库和其他Pod三方库之间的混合互调。

十二种情形:

1. 主工程内的OC 调用 主工程内的OC:

#import "NSObject.h"

导入头文件直接调用。

2. 主工程内的OC 调用 主工程内的Swift:

  1. 主工程中创建.pch文件,在TARGETS -> Build Setting -> 搜索pch -> 设置.pch文件的路径,

  2. 在.pch文件中添加 :

例如:#import "xxxxx_Swift.h"

(该文件命名规则为:"工程名_Swift.h",该文件为系统自动生成) ,

  1. 编译之后才可自动识别需要调用的Swift的文件 。

3. 主工程内的OC 调用 OC的Pod三方库:

#import 导入头文件直接调用。

4. 主工程内的OC 调用 Swift的Pod三方库:

  1. 如果仅在某个OC文件内调用该Swift库,在该库中导入头文件:@import 包的名字;

例如:@import RxSwift;

(不要给库文件名添加<>或者" "、不要遗漏分号";") ,

  1. 如果是全局多处调用该Swift库,在.pch文件 中导入头文件(导入规则同上) 。

5. 主工程内的Swift 调用 主工程内的OC:

  1. 自动创建桥接文件 (在OC或者Swift项目中第一次创建Swift或者OC文件时Xcode会自动提示创建桥接文件 ->` xxxxx-Bridging-Header.h`) ,

  2. 手动创建桥接文件(首先需要创建一个空的.h文件,命名规则为:`项目名-Bridging-Header.h`; 设置桥接文件的路径: 在TARGETS -> Build Setting -> 搜索Bridging -> 设置桥接文件的路径:``工程名/桥接文件所在的文件夹名/桥接文件的名字``) ,导入需要调用的OC的头文件,

例如:#import "NSObject.h"

6. 主工程内的Swift 调用 主工程内的Swift:

主工程内的Swift调用主工程内的其他Swift不需要添加头文件等引用,可以直接调用。

7. 主工程内的Swift 调用 OC的Pod三方库:

在桥接文件中添加需要调用的OC库的头文件。

例如:#import <AFNetworking/AFNetworking.h>

编译后可以直接调用

8. 主工程内的Swift 调用 Swift的Pod三方库:

  1. 只在某个Swift文件内调用该Swift库,在该Swift的文件中导入该Swift库的头文件,导入规则:`import RxSwift`(此处导入不添加@、不添加分号、不添加引号) ,

  2. 全局多处调用该Swift库,在主工程的`.pch`文件中添加该Swift库的头文件:`@import 包的名字; `

例如:@import RxSwift;

(不要给库文件名添加<>或者""、不要遗漏分号";") ,

  1. 编译后调用时才会出现自动提示 。

9. OC的Pod三方库 调用 OC的Pod三方库:

  1. Pod文件夹下的`.podspec文件`内添加依赖,例如:`s.dependency 'AFNetworking'`

导入头文件:例如:#import <AFNetworking/AFNetworking.h>

  1. 导入头文件直接调用。

10. OC的Pod三方库 调用 Swift的Pod三方库:

  1. 在OC库的Pod文件夹下的`.podspec文件`内添加对该Swift库的依赖(例如:`s.dependency 'TestSwift1', ~'0.1.0'`),

  2. 单独调用该Swift库,只需在这个OC文件内导入Swift库头文件即可(例如:`@import RxSwift;`[不要给库文件名添加<>或者""、不要遗漏分号";"] ),

  3. 全局调用该Swift库,在该OC库中创建`.h文件`(可以任意命名,但为了保持统一性,命名规则参照桥接文件的命名规则) -> 在OC库的Pod文件夹下的`.podspec文件`中添加对`.h文件`的引用(`s.prefix_header_contents = '#import "该OC库名-Bridging-Header.h"`) -> 重新pod update工程 -> 该`.h文件`会自动添加到OC库的`Support Files文件夹`下的`.pch文件`中 -> 在`.h文件`内导入Swift库的头文件即可(例如:`@import RxSwift;`[不要给库文件名添加<>或者""、不要遗漏分号";"] )。

11. Swift的Pod三方库 调用 OC的Pod三方库:

  1. Swift库内混编:在Swift库中进行库内的混编时,创建OC文件后pod update时,OC文件的头文件会被自动添加到该Swift库的`Support Files文件夹`下的`-umbrella.h文件`中 -> 可以直接调用,

  2. Swift库内依赖OC库混编:在该Swift库的`Pod文件夹`下的`.podspec文件`内添加依赖OC库(例如:`s.dependency 'AFNetworking, ~'2.3'`) -> 在主工程的`Podfile文件`中对调用的OC库做特殊处理添加(`:modular_headers => true ->` 例如:`pod 'AFNetworking', '2.3', :modular_headers => true`),

  3. 在Swift库内创建.h文件(可以任意命名,但为了保持统一性,命名规则参照桥接文件的命名规则) -> 此处不需要进行头文件的依赖和引用,直接进行pod update 后,该Swift库的`.h文件`会被自动同步添加到该Swift库的`Support Files文件夹`下的-`umbrella.h文件`中 -> 在Swift库内新建的.h文件中添加需要依赖的OC库的头文件(例如:`#import <AFNetworking/AFNetworking.h>`),

  4. 编译后调用时才会出现自动提示。

12. Swift的Pod三方库 调用 其他Swift的Pod三方库:

  1. 在该Swift库的Pod文件夹下的`.podspec文件`内添加依赖其他Swift库(例如:`s.dependency 'HandyJSON', ~'5.0.2'`) -> pod update,

  2. 单独调用其他Swift库,只需在调用其他Swift库的文件中添加其他Swift库的头文件,例如:`import HandyJSON`(注意:不添加@、不添加分号、不添加引号),

  3. 全局调用其他Swift库,在Swift库中创建`.h文件`(可以任意命名,但为了保持统一性,命名规则参照桥接文件的命名规则) -> pod update -> 该`.h文件`会被自动同步添加到Swift库的`Support Files文件夹`下的`-umbrella.h文件`中 -> 在新建的`.h文件`中添加其他Swift库的头文件(例如:`@import HandyJSON;`(不要给库文件名添加<>或者""、不要遗漏分号";"、不要遗漏@)。

作者:凯司机

链接:https://www.jianshu.com/p/ab424f811889

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
_OP_CHEN3 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
_OP_CHEN1 天前
【算法基础篇】(五十五)卡特兰数封神之路:从括号匹配到二叉树构造,组合数学的万能钥匙!
算法·蓝桥杯·c/c++·组合数学·卡特兰数·算法竞赛·acm/icpc
海棠AI实验室1 天前
VS Code Remote-SSH :原理、前置条件、配置套路与踩坑清单
运维·ssh
代码无bug抓狂人1 天前
C语言之产值调整(蓝桥杯省B)
c语言·开发语言·蓝桥杯
有想法的py工程师1 天前
PostgreSQL archive_command 场景下的 postgres 免密 SSH 配置与排查实录
数据库·postgresql·ssh
闻缺陷则喜何志丹1 天前
P8699 [蓝桥杯 2019 国 B] 排列数|普及+
c++·数学·蓝桥杯·数论·洛谷·数列
闻缺陷则喜何志丹2 天前
【前后缀分解 排序】B4274 [蓝桥杯青少年组省赛 2023] 数字游戏|普及+
c++·蓝桥杯·排序·洛谷·前后缀分解
fendoudexiaoniao_ios2 天前
iOS 列表拖拽cell排序
ios·swift
啊我不会诶2 天前
蓝桥杯练习 混乱的数组
c++·蓝桥杯
XH华2 天前
备战蓝桥杯,第八章:位运算符和操作符属性
职场和发展·蓝桥杯