Use Swift Dynamic Framework (如何科学地引用第三方 Swift 库)
转自:http://andelf.github.io/blog/2014/07/07/use-swift-dynamic-library/
CocoaPods 由于完全使用静态链接解决方法,过度依赖 Objective-C ,目前应该是官方 repo 有提到是 -Xlinker
error , 这个问题之前我也遇到过,无解。除非手工执行 ar
不用 ld
和 libtool
。
小伙伴有用子目录的方法引用代码,貌似不错,还有就是直接用 git submodule
,看起来维护性也可以。
简单解决方案
一个良好的第三方库应该实现为 Cocoa Touch Framework (实际内容为 Header + 动态链接库)。而不是直接把 Swift 代码 Copy 过来放入自己的项目。这里以一个简单项目为例,介绍如何科学使用。
目标描述
用 Swift 创建一个 Demo ,使用 SwiftyJSON 和 LTMorphingLabel 库。
项目的名字叫 DemoApp 。
创建 Workspace
创建一个 Workspace ,名字随意,位置能找到就好。这个 Workspace 主要用来管理我们的项目及其依赖的第三方库。
创建 DemoApp
在 Workspace 创建一个 App ,因为是测试所以我选了 Single View Application 。
引入 SwiftyJSON
SwiftyJSON 是一个 Cocoa Touch Framework ,可以直接使用, git clone
后,添加项目到 Workspace 即可。
尝试操作发现。。最容易最不会出错的方法就是直接从 Finder 里把 .xcodeproj
文件拖动到 Workspace 。
引入 LTMorphingLabel
LTMorphingLabel 是一个 App Deme 式项目。其中 Label View 的实现在一个子目录中。可以采用创建 Cocoa Touch Framework 的方法来引入这几个文件。
当然也可以直接把目录拖到我们的 DemoApp 里,不过太原始粗暴了。
为 App 添加依赖
在 DemoApp 的 Genral 选项卡中,添加 Linked Frameworks and Libraries 。选择 Workspace 中 SwiftyJSON 和 LTMorphingLabel 两个 .framework
。
如果是直接选择来自其他项目的 .framework
而不是同一 Workspace ,那么这里也许还要同时加入 Embedded Binaries
。
使用
添加好依赖后,就可以在 DemoApp 项目代码中 import SwiftyJSON
或者 import LTMorphingLabel
来使用对应的库。同时还可以用 Command + 鼠标点击的方法查看声明代码。
除错
比较坑爹的是,实际上按照以上方法, LTMorphingLabel
并不能正常使用,查看报错信息发现是自动生成的 LTMorphingLabel-Swift.h
有处语法无法被识别,编辑器找到 .h
文件,注释掉这行诡异代码即可。
看起来目前的 Bridge Header 和 -emit-objc-header 实现还是有问题的。小伙伴一定要淡定。
对于非 Workspace
如果不喜欢使用 Workspace ,也可以将第三方库的编译结果,一个 .framework
目录拖到项目文件里,然后添加 Embedded Binaries
。
评论
创建 Cocoa Touch Framework 选项中,可以使用 Swift 代码,此时编译结果(默认)会包含 module.modulemap
文件, 之前有介绍过它的作用,通过它, Swift 可以使用第三方模块。参考 Module System of Swift (简析 Swift 的模块系统) 。
实际上这个解决方案绕了一大圈,通过 Swift 文件导出 ProjName-Swift.h
、然后 module.modulemap
模块描述文件引入、然后再由 Swift 导入。
其实 .framework
同时也包含了 ProjName.swiftmodule/[ARCH].swiftmodule
不过看起来没有使用到,而且默认在 IDE 下也不支持 Swift 从 .swiftmodule
文件导入,比较坑。希望以后版本能加入支持。
.framework
包含了所有 Swift 标准库的动态链接库,小伙伴可能会以为这会导致编译后的 App 变大。其实大可放心,任何 Swift 语言的 App 都会包含这些动态链接库,而且只会包含一个副本。此方法对 App 最终的大小几乎无影响。
注: 个人测试了下,发现这个 .swiftmodule
是可以通过其他方法使用的,绕过 module.modulemap
,应该是更佳的解决方案,但是需要控制命令行参数。
至于静态链接库,过时了。抛弃吧。
Use Swift Dynamic Framework (如何科学地引用第三方 Swift 库)的更多相关文章
- 【Angular】关于angular引用第三方组件库无法改变其组件样式 :host ::ng-deep
[Angular]关于angular引用第三方组件库无法改变其组件样式 :host ::ng-deep css修改:无效 .ant-input-affix-wrapper .ant-input:not ...
- 如何在 FineUIMvc 中引用第三方 JavaScript 库
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 引入第三方颜色选择器 在 FineUIMvc 中使用第三方 JavaScript 遵循一定的约定,也非常简单. 下面以官网示例为 ...
- 一种优雅的条件引用第三方.net库的方法
1.遇到的问题 今年我一直在开发一个WebApiClient库,旨在.net下能像java的retrofit一样,方便地请求服务端的http接口.在这restful api盛行的年代,json的身影无 ...
- css引用第三方字体库
对应的CSS文件中如下方式进行字体库的引用: @font-face { font-family: '造字工房情书'; src: url('../fonts/MFQingShu_Noncommercia ...
- 解决vue webApp使用lib-flexible和px2rem引用第三方ui库后,样式变小问题
首先,需要卸载项目中的postcss-px2rem. npm uninstall postcss-px2rem --save-dev 其次,安装postcss-px2rem-exclude npm i ...
- Cocos2dx如何引用第三方SO文件(Android NDK)
做项目的过程中发现,引用第三方的库lib3rdsdk.so,当直接把lib3rdsdk.so放进armeabi文件夹里,会被删除掉.查网上资料都说的不全,经过实验,最简单的方法就是在jni下的andr ...
- 实测iOS Dynamic Framework 对 App 启动时间的影响效果
最近看到的Slow App Startup Times里提到: The dynamic loader finds and reads the dependent dynamic libraries ( ...
- Swift基础语法-内存管理, 自动引用计数
1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...
- Swift 学习笔记 (三) 之循环引用浅析
原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person { l ...
随机推荐
- 1114作业 html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 易初大数据 2019年11月8日 linux 王庆超
◆linux系统的特点: (1)完全免费. (2)高效.安全.稳定. (3)支持多种硬件平台. (4)友好的用户界面. (5)强大的网络功能. (6)支持多任务.多用户. ◆linux体系: 1.li ...
- 关于vue ui组件
一.vue ui 组件 1: vue 当前很火前端框架vue 针对PC用户 pc 端与移动端区别 (1)屏幕宽度:992px > (2)操作方式:鼠标 事件 手指:触碰操作 -饿了么:基于 ...
- linux-mysql8的安装步骤详解及需要注意的坑
(本文由言念小文原创,转载请注明出处) 前言 最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导资料. Linux上mysql安装方法个人目前使用的有两种: 一种是基于rpm安装: 另一 ...
- Laravel 5 - 文件上传
一.简介 Laravel 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包. Laravel 集成的 Flysystem 提供了简单的接口,可以操作本地端空 ...
- 【Java】抽象类和接口详解
抽象类 一.抽象类的概述 现在请思考一个问题:假如我现在又Dog.Cat.Pig等实例对象,现在我们把它们都抽象成一个Animal类,这个类应该包含了这些Dog.Cat.Pig等实例对象eat的功能, ...
- Bootstrap——导航条(navbar)
导航条和导航从外观上差别不是太多,但在实际使用中导航条要比导航复杂得多. 导航条(navbar)中有一个背景色.而且导航条可以是纯链接(类似导航).表单以及表单和导航一起结合等多种形式. 在制作一个基 ...
- iOS核心动画高级技巧-1
1. 图层树 图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做L ...
- python:timeit模块
(鱼c)timeit模块详解——准确测量小段代码的执行时间 http://bbs.fishc.com/forum.php?mod=viewthread&tid=55593&extra= ...
- centos安装后第一次重启,许可协议、Kdump
1.许可协议,服务器键盘操作找到许可 确定(遇到过,第一次懵逼了) 2.Kdump是RHEL提供的一个崩溃转储功能,用于在系统发生故障时提供分析数据,它会占用系统内存,一般选择关闭(默认是关闭)(这个 ...