Swift Package 技巧及混编兼容问题详解
目录
创建 Package使用 Package维护 Package版本控制本地调试修改Package 之间的依赖混编问题target 拆分引用以及和 cocoapods 的兼容问题创建 Package
mkdir somePath cd somePath swift package init (--type library/executable/empty/system module)
其中,type 的四种类型分别对应:
(资料图)
library: 库(默认)executable: 可执行文件empty: 空项目system module: 系统模板项目一般情况下默认即可
创建 package 之后,还可以使用 swift package generate-xcodeproj
创建一个Xcode项目来编译和调试代码
使用 Package
在 Xcode 菜单栏中,选择 file -> add packages
可以指定 package 的版本规则
维护 Package
版本控制
在 package 路径下,使用 git init
来创建一个仓库。之后上传至远端即可
本地调试修改
对于通过 cocoapods 引入的库,如果想在本地修改该库并提交的话,需要在 PodFile 里面把路径改成本地的,然后再 pod install
一下,比较麻烦
但是修改 swift package 引入的库就很方便了,直接把 package 的文件目录拖到工程目录下即可。修改好提交到远端之后,右键 delete -> remove reference (move to trash 会删掉本地文件)
然后 file -> packages -> update to latest,即可更新到最新的版本
Package 之间的依赖
在每个 swift package 的目录下都有个 Package.swift
文件。内容如下:
// swift-tools-version:5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "some name", products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "some name", targets: ["some name"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "some name", dependencies: []), .testTarget( name: "some name", dependencies: ["some name"]), ] )
其中的字段分别表示:
name: 库/项目名字products: 库/项目生成的东西,可以是 library 或者 executable. 同一个库/项目可以生成多个 library 或者 executabledependencies: 此库/项目所依赖的库,及依赖库的 URL 和版本等信息。如果依赖本地库的话,可以添加.package(path:"local path")
targets: 库/项目生成的目标
相较于 cocoapods,swift package 还是更加方便点的,而且是苹果自家的产品。但是目前很多三方库都在 cocoapods 上,swift package 的大面积普及还需要一段时间
混编问题
target 拆分
Apple 官方文档里说:
Targets can contain Swift, Objective-C/C++, or C/C++ code, but an individual target can’t mix Swift with C-family languages. For example, a Swift package can have two targets, one that contains Objective-C, Objective-C++, and C code, and a second one that contains Swift code.
也就是说,SPM 是支持 objc 以及 C 系代码的。但是同一个 target 里面只能有一种语言,Swift 文件不能和 objc 文件放到一个 target 里。
如果我们想要在一个 SPM 仓库里面同时放置两种语言的代码的话,就需要将仓库拆分为两个 target:
let package = Package( name: "MyModule", platforms: [.iOS(.v11), .macOS(.v11)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "MyModule", targets: ["MyModule", "MyModule_Objc"]) ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "MyModule_Objc", dependencies: [], publicHeadersPath: "include", cSettings: [.headerSearchPath(".")], cxxSettings: [.headerSearchPath(".")] ), .target( name: "MyModule", dependencies: ["MyModule_Objc"], path: "Sources/MyModule", swiftSettings: [.define("SPM_MODE")] ), .testTarget( name: "MyModuleTests", dependencies: ["MyModule"]), ] )
其中,仓库文件结构应该为:
- MyModule | |-README.md | |-Package.swift | |-Sources | |-MyModule | | | |- MyPackage.swift | |-MyModule_Objc | |-Include | | | |- MyObjCClass.h | |- MyObjCClass.m
Sources 文件夹拆分为两个子文件夹,分别是两个 target 的路径。Swift target 依赖 objc 的 target, objc 的 target 可以设置公开 header 的路径。
这样,objc 以及 C/C++ 这些 C 系的文件都放在 MyModule_Objc
文件夹下,Swift 文件放到 MyModule
文件夹下,就可以在同一个 SPM 仓库下实现混编了。
引用以及和 cocoapods 的兼容问题
在上面的 package 设置里面可以看到一行预处理宏的定义:
swiftSettings: [.define("SPM_MODE")]
这个设置是用来标识当前库是通过 SPM 方式引入的。根据上文,SPM 模式下,当前库的 Swift 和 objc 是两个 target。因此,同一个库的 Swift 文件想要调用 objc 文件的话,必须引入 objc 的 target:
import MyModule_Objc // your code...
但是,我们的库一般情况下还是要支持 cocoapods 的。在 cocoapods 模式下,同一个仓库的 Swift 和 objc 文件是不需要拆分为两个 target 的,pod 是通过桥接文件等来实现两者之间相互调用的。
那么问题就来了,当使用 cocoapods 引入当前库时,import MyModule_Objc
是肯定会报错的,因为 pod 并不会生成 MyModule_Objc
。
这时候,我们在 package 文件里预先定义的宏就派上用场了:
#if SPM_MODE import FoundationX_Objc #endif
只有在 SPM 模式下,才会 import MyModule_Objc
,这样就解决了与 cocoapods 的兼容问题。
以上就是Swift Package 技巧及混编兼容问题详解的详细内容,更多关于Swift Package混编兼容的资料请关注脚本之家其它相关文章!
标签:
-
2022-05-23 16:13:32
上海奉贤等区开展常态化防疫压力测试 有序开放公交、公园、公共服务场所、公共街区商区<
本报上海5月21日电 (记者刘士安、曹玲娟)上海正在奉贤等区开展常态化防疫压力测试。在21日召开的上海市疫情防控工作新闻发布会上,奉
-
2022-05-23 16:13:32
“抗疫 宅家云课堂”,吸引沪上老同志观看50万人次<
由上海市委老干部局主办,上海市老干部大学、市科技助老服务中心承办的“抗疫 宅家云课堂”系列直播讲座自4月12日启动以来,深受老同
-
2022-05-23 16:13:32
“代跑腿”买药、开通绿色通道 丰台为管控区居民提供便捷医疗服务<
“真是太感谢了,解决了我的燃眉之急!”家住假日万恒社区的杨女士对前来送药的居委会工作人员说。 自5月17日6时起,丰台区对青塔街...
-
2022-05-23 16:13:32
上海嘉定:儿童计划免疫接种全部恢复,实行预约制<
在5月22日召开的上海市新冠肺炎疫情防控新闻发布会上,嘉定区副区长王浩介绍,从4月28日开始,嘉定在防范区逐步有序恢复老年人疫苗接种
-
2022-05-23 16:13:32
乡村振兴看新疆 | 种下红樱桃 结出“致富果”<
央广网阿图什5月22日消息(记者 罗成 通讯员 杨林)乡村振兴靠产业,产业发展靠特色。新疆阿图什市阿扎克镇麦依村积极引导农民因地制
-
2023-06-24 14:55:44
Swift Package 技巧及混编兼容问题详解
这篇文章主要为大家介绍了Swift Package 技巧及混编兼容问题详解,有
-
2023-06-24 14:07:53
播报:考研现场确认时间安排_考研现场确认时间
1、考研现场确认一般在十月份左右进行。2、考研现场确认就是为了核对考
-
2023-06-24 12:58:07
青岛双星苏明:围绕三大主业实施“新四化”战略-今日视点
近日,由青岛市委网信办主办,首页传媒有限责任公司承办的青岛企业之星
-
2023-06-24 12:02:14
投资骗案急升,被伪冒身份推销A股,股评人躺着中枪-世界速看料
“赢粒糖,输间厂”,市民错信网上投资揾快钱骗案,结果因小失大,有受
-
2023-06-24 11:01:28
每日快播:中国足球归化迎久违喜讯!7归化有望携手空降,驰援国足冲世界杯
中国足球归化迎久违喜讯!7归化有望携手空降,驰援国足冲世界杯,中超,
-
2023-06-24 10:22:33
逾百件作品彰显非遗魅力
市民和学生在参观阳江职院师生漆艺作品展。李向东摄阳江日报讯(记者
-
2023-06-24 09:44:30
环球最资讯丨八宝粥的配料是哪八样配料_八宝粥的配料是哪八样
1、八宝粥”的原意是指用八种不同的原料熬制成粥。2、但是在今天,许多
-
2023-06-24 08:48:40
巨化股份:联州公司首条制冷剂全自动气雾产品生产线投入使用 天天时快讯
据巨化股份消息,近日,全资子公司联州公司首条制冷剂全自动气雾产品生
-
2023-06-24 07:42:44
擦伤用碘伏会留疤吗_碘伏可以擦伤口吗
通常情况下,碘伏可以擦拭伤口。碘伏是一种常用的消毒剂,刺激性较小,
-
2023-06-24 06:42:58
夏至端午相连养生注意“三避”-世界快消息
夏至端午相连养生注意“三避”,主流媒体,山西门户。山西新闻网是经国务
-
2023-06-24 03:53:55
资讯推荐:ltro lightroom软件
8年了!欧洲结束负利率,日本会步后尘?8年了!欧洲宣告结束负利率时代
-
2023-06-24 01:10:44
宋月
1、宋月,女,博士,西安电子科技大学数学与统计学院副教授、硕士生导
-
2023-06-23 22:57:10
外观小改,配置有亮点:探店比亚迪宋 PLUS 冠军版 DM-i
一直以来,在20万以内的家用SUV市场中,比亚迪都是非常有竞争力的一个
-
2023-06-23 21:54:10
今日观点!闽南元素设计_闽南元素
1、闽南代表性建筑是指福建南部建筑的典型代表,其特点是红砖白石双坡
-
2023-06-23 20:43:59
游园赏景品民俗 多姿多彩过端午_焦点
端午假期,天南地北的人们游园、赏景、品民俗,在多姿多彩的活动中欢度
-
2023-06-23 19:33:58
代沟是什么_什么是代沟
1、代沟是指年轻一代与老一辈在思维方式、价值观念、生活态度、兴趣爱
-
2023-06-23 18:51:26
热到破纪录后北方高温何时能减弱?南方降雨间歇期下周到来但也要热了!|全球热消息
最近,北京、天津、河北、山东等地热力值飙升,局地热到破纪录!南方暴
-
2023-06-23 17:40:13
全球微头条丨家族的荣光下载_家族荣光国语版全集
1、我的度盘里有家门的荣光DVD国语中字全集,如需要视频请用财富值来兑
-
2023-06-23 16:55:54
⚽足协杯战报:宋润潼一剑封喉 河南队1-0击败湖南湘涛 晋级16强 今日关注
宋润潼打进全场唯一进球,河南队客场1-0击败湖南湘涛,晋级16强。
-
2023-06-23 16:09:14
苹果6s电池不耐用怎么回事_苹果6s电池不耐用
你们好,最近小未来发现有诸多的小伙伴们对于苹果6s电池不耐用怎么回事
-
2023-06-23 15:04:00
焦点报道:北京:严查餐饮等生产经营单位可燃气体报警装置安装情况
北京商报讯(记者张天元)6月23日,据北京日报消息,北京市城市管理委
-
2023-06-23 14:01:09
端午期间北有高温“烤验” 南有梅雨侵扰 疾控部门发防护指南-全球今头条
央视网消息:南方新一轮强降雨过程核心时段已开启,江西、广西局地有大
-
2023-06-23 13:15:59
2023年江西高招录取咨询信访窗口设在南昌市民中心 速看
6月23日,江西省教育厅发布高招服务事项须知。2023年高招录取咨询信访
-
2023-06-23 12:04:50
22日晚,大S经纪人廖玮琪透过台媒发声明……
大S经纪人发声明 22日晚,大S经纪人廖玮琪透过台媒发声明,怒斥葛斯齐
-
2023-06-23 11:05:43
焦点热议:性价比最高的十款笔记本电脑 十大高性价比笔记本电脑推荐排行
hello大家好,我是城乡经济网小晟来为大家解答以上问题,性价比最高的
-
2023-06-23 10:11:48
今天SOL的价格是多少?Solana 今日最新价格分析
虚拟货币交易平台最高可领6万元盲盒奖为虚拟货币爱好者打造的一站式
-
2023-06-23 09:56:25
售罄怎么读音是什么_售罄怎么读
1、售罄【拼音】:[shòuqìng]【字义】:卖完了,一般指商品销售一空
-
2023-06-23 08:53:10
【天天热闻】多省预警手足口病来袭!4种情况及时就医
多省预警手足口病来袭!4种情况及时就医
-
2023-06-23 07:57:59
【全球时快讯】在端午之后,这四大星座收获桃花运,异性缘极佳,爱如潮水了
在端午之后,摩羯座的朋友收获桃花运,展现你们爱情魅力的时候要到了,
-
2023-06-23 06:33:52
这也能骂❓❓托纳利ins遭球迷刷屏:叛徒!又一个多纳鲁马 环球短讯
多家媒体报道,托纳利很接近加盟纽卡,这一消息令许多国内球迷对米兰资
-
特写:风吹稻香忆袁老——袁隆平逝世一周年的墓前追思
2022-05-23 16:13:29 -
北京5月21日区域核酸筛查初筛10管混采阳性
2022-05-23 16:13:29 -
北京两地由高风险降为中风险 一地降为低风险地区
2022-05-23 16:13:29 -
5月21日15时至22日15时,北京新增本土新冠肺炎病毒感染者94例
2022-05-23 16:13:29 -
108岁病人顺利出院,瑞金医院卢湾分院已收治10位百岁老人
2022-05-23 16:13:29 -
生态花园助力乡村振兴 重庆小山村展现“乡土美学”
2022-05-23 16:13:29 -
上海金山政务服务场所逐步恢复服务
2022-05-23 16:13:29