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

news/2024/7/24 2:10:25 标签: swift, 蓝桥杯, ssh

环境 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",该文件为系统自动生成) ,

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

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

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

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

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

      例如:@import RxSwift;

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

   2. 如果是全局多处调用该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; 

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

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

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

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

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

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

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://www.niftyadmin.cn/n/5414035.html

相关文章

【嵌入式——QT】Model/View

【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据&#xff0c;典型的如数据库应用程序&#xff0c;数…

基于uniapp cli项目开发的老项目,运行报错path.replace is not a function

项目&#xff1a;基于uniapp cli的微信小程序老项目 问题&#xff1a;git拉取代码&#xff0c;npm安装包时就报错&#xff1b; cnpm能安装成功包&#xff0c;运行报错 三种方法尝试解决&#xff1a; 更改代码&#xff0c;typeof pathstring的话&#xff0c;才走path.replace…

【Python学习篇】Python基础入门学习——你好Python(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

用C语言easyx 做一个《正弦彩环》

#include <easyx.h> #include <cmath> #include<stdio.h> #define WIN_WIDTH 800 #define WIN_HEIGHT 800int main() {// 初始化图形界面initgraph(WIN_WIDTH, WIN_HEIGHT);setbkcolor(WHITE);cleardevice();// 开启双缓冲// BeginBatchDraw();// 设置颜色变…

Day23:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

目录 具体安全知识点 身份验证-Cookie使用 身份验证-Session使用 唯一性判断-Token使用 总结 源码 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&…

06、MongoDB -- MongoDB 基本用法(删除文档、查询文档、查询运算符)

目录 MongoDB 基本用法演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【admin】数据库的 mongodb 客户端命令登录【test】数据库的 mongodb 客户端命令 删除文档语法格式两个变体版本&#xff1a;1、remove&#xff1a;根据【name】字段删除一条文档2、deleteOne&…

使用langchain搭建本地知识库系统(新)

使用langchain搭建自己的本地知识库系统&#xff08;新&#xff09; 前些时候字节上了自己的扣子&#xff0c;用来构建我们自己的 agent [AI 实战&#xff1a;手把手教你使用「扣子/coze」来搭建个人blog知识库 受到启发&#xff0c;想在本地或者自己的服务器上面搭建一个知识…

Nodejs 第五十三章(serverLess)

什么是serverLess? serverLess并不是一个技术&#xff0c;他只是一种架构模型&#xff0c;(无服务器架构)&#xff0c;在传统模式下&#xff0c;我们部署一个服务&#xff0c;需要选择服务器Linux,windows等,并且还要安装环境&#xff0c;熟悉操作系统命令&#xff0c;知晓安…