iOS开发——在 OC 项目中使用基于 Swift 的 CocoaPods 库

2023-10-30

在 OC 项目中使用基于 Swift 的 CocoaPods 库

随着 Swift 的流行,各种神奇的库也开始有对应的 Swift 版本了,而其中一些更神奇的库却只有 Swift 版本…
正巧接手了一个前人用 Swift 写的项目,里面有一个非常关键的图表库,找了半天硬是没有发现类似的 OC 版开源库。出于不想造轮子的心态,就让我们这些”落后”的 OC 党想办法兼容这些库吧!好在苹果为了推广这门新语言已经做好了准备工作,虽然还是需要绕个路,但是比起造轮子来,还是简单了不少。

因为项目是用 CocoaPods 来管理第三方库的,所以这次的兼容工作也会在 CocoaPods 上展开。不过道理还是那个道理,如果没有用到 CocoaPods 的话,直接跳过下面关于 Podfile 的那一步就好了。

Podfile

要用 CocoaPods,首先要修改的当然是 Podfile,这是最简单的一步,只需要在文件开始加上这一句:

1
use_frameworks!

这是告诉 CocoaPods:“请把我要用到的第三方库用动态框架的形式集成进来”。
因为 Apple 不允许开发者构建内含 Swift 代码的静态库,所以要往 OC 项目中集成第三方 Swift 代码的时候就只能通过动态框架( framework )的形式了。

而 CocoaPods 还不能很好地将 framework 和静态库混编到一起,所以要么不用 framework,要用就要全部用上。关于这一点,CocoaPods 官博上的原话是这样说的:

This is an all or nothing approach per integrated targets, because we can’t ensure to properly build frameworks, whose transitive dependencies are static libraries.

Xcode配置

这一步的操作比较绕,但总体来说还是简单的。

首先在你的项目中任意创建一个 Swift 文件,这时候聪明的 Xcode 会问你需不需要它帮助你创建一个 Bridging 文件。
bridging-header

嘛,这当然是最好不过了,然而如果(像我这样)手贱点了 Don’t create ,那以后不管你创建再多的 Swift 文件,它都不会问你了。不过,这当然是有手动操作的途径:

  1. 手动创建一个头文件,名字叫 Your_Product_Module_Name-Bridging-Header.h,注意不是 Project_Name
  2. 确保你的项目目录下至少有一个 Swift 文件。
  3. 确保在 Targets 的 Build Settings 里,Product Module Name 是有值的。(如果没有,直接设置为 $(PRODUCT_NAME) 就可以了)
  4. 将 Project 的 Build Settings 里的 Defines Modules 设置为 Yes。(如果项目里没有创建过 Swift 文件的话,这个设置可能是不可见的)

配置完成!进入代码环节!

代码

其实也不需要什么代码啦。

完成了上面的所有步骤之后,Xcode 会自动生成一个名为 Your_Product_Module_Name-Swift.h 的文件,以后只要在需要使用到 Swift 代码的地方 import 这个文件就可以了。
现在已经可以直接按照 OC 的语法去调用 Swift 里的属性和方法了,开始愉快地 coding 吧 :)

P.S. 为了避免循环引用,-Swift.h 文件只能在 .m 文件中 import。如果需要在 .h 文件中使用,就只能用 @class 来前向声明。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发——在 OC 项目中使用基于 Swift 的 CocoaPods 库 的相关文章

随机推荐

  • 【fpga里Verilog语言的小知识点】

    提示 小白撰写 如有错误希望指出 目录 前言 总结 前言 记录一下学习fpga里Verilog语言的小知识点 持续更新 提示 以下是本篇文章正文内容 1 A B C D 是一个条件运算符 含义是如果 B 为 TRUE 则把 C 连线 A 否
  • C语言实现扫雷(含展开,附源码)

    我相信在做的各位都是玩过扫雷的 游戏玩法就不赘述了 直接进入主题 先思考后敲代码 首先 我将扫雷分为两个棋盘 一个放雷 另一个为玩家猜测盘 这就有同学问了 设置一个棋盘不就完了 这样不就搞复杂了吗 先简短的回答这位同学的问题 因为我的考虑是
  • Docker18:容器互联----link (给新手玩的,进阶方法是 自定义网络)

    容器互联 link 思考一个场景 我们编写了一个微服务 database urla ip 项目不重启 数据库ip换掉了 我们希望可以处理这个问题 可以 名字来进行访问容器 若能实现就可以实现高可用 探究 inspect 其实这个 tomca
  • Sed编辑器

    目录 sed编辑器 命令格式 常用选项 常用操作 打印内容 使用地址 编辑 替换 插入 sed编辑器 sed是一种流编辑器 流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的数据 这些
  • matlab的求解方程组函数solve、dsolve、ode系列

    一 求解方程组函数 solve 示例 求解含有参数的方程组 ax by 10 ax by 20 编程实现 syms a b x y s solve a x b y 10 a x b y 20 x y sol x s x sol y s y
  • Kettle变量和自定义java代码的实例应用

    1 kettle properties参数配置数据源连接和FTP连接 由于测试环境和生产环境中数据库连接FTP等配置会在部署过程中变更 所以预先定义成配置项 在配置文件中修改 这样测试和发布将会变得简单 下面以数据库为例说明这类配置的使用
  • sys.exc_info()异常处理Python内置

    sys系统相关的参数和函数 Python内置于系统相关的库 sys exc info 此函数返回一个三值元组 包含当前正在处理的异常信息 返回的信息同时针对当前线程和当前堆栈框架 如果当前堆栈框架不是在处理一个异常 该信息取自调用的堆栈信息
  • 用科学计数法表示二进制小数_数值数据的表示

    在学习之前 我们先来看一段代码的计算 为什么会出现这样的结果呢 std 在计算机中最主要的数据类型有无符号整型 有符号整型 浮点数 布尔值 布尔值 就是真 假 1或者0 在计算机中用最小的1个字节表示 即8位 无符号整型 即我们数学中的正整
  • android本地xml配置,Android Studio创建的Android项目一般需要忽略

    1 idea文件夹 2 gradle文件夹 3 所有的build文件夹 4 所有的 iml文件 5 local properties文件 第一种 在Android Studio中设置 第二种 在项目的 idea workspace xml的
  • Java多线程文件下载器高文件下载速度

    使用多线程下载器提高文件下载速度 在进行大文件下载时 使用多线程技术可以显著提高下载速度 本文将介绍如何使用多线程下载器来实现并行下载 以加快文件下载过程 多线程下载器简介 多线程下载器是一种利用多线程同时下载文件的工具 它将大文件分割成多
  • SSD(pytorch)自建数据集训练及测试

    一 数据集准备 SSD代码 GitHub amdegroot ssd pytorch A PyTorch Implementation of Single Shot MultiBox Detector 采用的VOC格式的数据集 在data文
  • odoo16安装教程,全球第一开源ERP平台

    虚拟机版本 ubuntu 22 10 本人用的是这个版本的ubuntu系统 也可以使用最新版本的 准备工作 打开虚拟机 ubuntu系统 进入终端 更新系统 sudo apt get update sudo apt get upgrade
  • js 获取两个时间之间相差月份

    话不多说 直接上代码 获取两个时间月份差 function getMonths start end var result var starts start split var ends end split var staYear start
  • Unity UGUI 添加 Material(材质)

    在给 UGUI 添加 Material 时 如果 Material 中的 Shader 不做特殊处理的话 那么此组件将会变成纯黑色 如果需要添加 Material 则需要在 Shader 中做 UGUI 专门的处理 Properties U
  • Android 11以下DialogFragment里弹出PopWindow显示问题

    最近在写UI的时候发现一个非常有意思的事情 Android 11以下在DialogFragment里面弹出PopWindow 最终会被截取 尝试过一些方法以后将解决方案做一个记录 mPopWindow setClippingEnabled
  • 华为手机连电脑当摄像头用_今天才知道,华为手机摄像头还能这样用!还不会用你买什么华为?...

    大家都知道 华为手机的摄像头十分给力 拍照效果很好看 但是你知道吗 华为手机摄像头 不仅仅能拍照 它还有很多隐藏的高级用法 比如今天说的这两个 不到10 的花粉会用 挺可惜的 一 华为手机摄像头高级用法 1 扫描文档 10分钟后就下班了 领
  • Python Tkinter Menu使用教程

    Menu类控件用来实现顶层 下拉 弹出菜单 Patterns Toplevel menus被用来显示在标题栏 root窗口或者其他顶层窗口上 创建一个顶层菜单 创建Menu类的实例 然后使用add方法添加命令或者其他菜单内容 root Tk
  • 30分钟掌握STL系列(二)

    30分钟掌握STL系列 二 迭代器 迭代器提供对一个容器中的对象的访问方法 并且定义了容器中对象的范围 迭代器就如同一个指针 事实上 C 的指针也是一种迭代器 但是 迭代器不仅仅是指针 因此你不能认为他们一定具有地址值 例如 一个数组索引
  • 滴滴前端高频react面试题总结

    当调用 setState的时候 发生了什么操作 当调用 setState时 React做的第一件事是将传递给setState的对象合并到组件的当前状态 这将启动一个称为和解 reconciliation 的过程 和解的最终目标是 根据这个新
  • iOS开发——在 OC 项目中使用基于 Swift 的 CocoaPods 库

    在 OC 项目中使用基于 Swift 的 CocoaPods 库 随着 Swift 的流行 各种神奇的库也开始有对应的 Swift 版本了 而其中一些更神奇的库却只有 Swift 版本 正巧接手了一个前人用 Swift 写的项目 里面有一个