<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
mkdir somePath cd somePath swift package init (--type library/executable/empty/system module)
其中,type 的四種型別分別對應:
一般情況下預設即可
建立 package 之後,還可以使用 swift package generate-xcodeproj
建立一個Xcode專案來編譯和偵錯程式碼
在 Xcode 選單欄中,選擇 file -> add packages
可以指定 package 的版本規則
在 package 路徑下,使用 git init
來建立一個倉庫。之後上傳至遠端即可
對於通過 cocoapods 引入的庫,如果想在本地修改該庫並提交的話,需要在 PodFile 裡面把路徑改成原生的,然後再 pod install
一下,比較麻煩
但是修改 swift package 引入的庫就很方便了,直接把 package 的檔案目錄拖到工程目錄下即可。修改好提交到遠端之後,右鍵 delete -> remove reference (move to trash 會刪掉本地檔案)
然後 file -> packages -> update to latest,即可更新到最新的版本
在每個 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"]), ] )
其中的欄位分別表示:
.package(path:"local path")
相較於 cocoapods,swift package 還是更加方便點的,而且是蘋果自家的產品。但是目前很多三方庫都在 cocoapods 上,swift package 的大面積普及還需要一段時間
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 倉庫下實現混編了。
在上面的 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混編相容的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45