最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift?Package?技巧及混編兼容問題詳解

 更新時(shí)間:2023年03月13日 16:12:02   作者:云逸_  
這篇文章主要為大家介紹了Swift?Package?技巧及混編兼容問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

創(chuàng)建 Package

mkdir somePath
cd somePath
swift package init (--type library/executable/empty/system module)

其中,type 的四種類型分別對(duì)應(yīng):

  • library: 庫(默認(rèn))
  • executable: 可執(zhí)行文件
  • empty: 空項(xiàng)目
  • system module: 系統(tǒng)模板項(xiàng)目

一般情況下默認(rèn)即可

創(chuàng)建 package 之后,還可以使用 swift package generate-xcodeproj 創(chuàng)建一個(gè)Xcode項(xiàng)目來編譯和調(diào)試代碼

使用 Package

在 Xcode 菜單欄中,選擇 file -> add packages

image-20220109204812598.png

可以指定 package 的版本規(guī)則

維護(hù) Package

版本控制

在 package 路徑下,使用 git init 來創(chuàng)建一個(gè)倉庫。之后上傳至遠(yuǎn)端即可

本地調(diào)試修改

對(duì)于通過 cocoapods 引入的庫,如果想在本地修改該庫并提交的話,需要在 PodFile 里面把路徑改成本地的,然后再 pod install 一下,比較麻煩

但是修改 swift package 引入的庫就很方便了,直接把 package 的文件目錄拖到工程目錄下即可。修改好提交到遠(yuǎn)端之后,右鍵 delete -> remove reference (move to trash 會(huì)刪掉本地文件)

然后 file -> packages -> update to latest,即可更新到最新的版本

Package 之間的依賴

在每個(gè) swift package 的目錄下都有個(gè) Package.swift 文件。內(nèi)容如下:

// 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: 庫/項(xiàng)目名字
  • products: 庫/項(xiàng)目生成的東西,可以是 library 或者 executable. 同一個(gè)庫/項(xiàng)目可以生成多個(gè) library 或者 executable
  • dependencies: 此庫/項(xiàng)目所依賴的庫,及依賴庫的 URL 和版本等信息。如果依賴本地庫的話,可以添加 .package(path:"local path")
  • targets: 庫/項(xiàng)目生成的目標(biāo)

相較于 cocoapods,swift package 還是更加方便點(diǎn)的,而且是蘋果自家的產(chǎn)品。但是目前很多三方庫都在 cocoapods 上,swift package 的大面積普及還需要一段時(shí)間

混編問題

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 系代碼的。但是同一個(gè) target 里面只能有一種語言,Swift 文件不能和 objc 文件放到一個(gè) target 里。

如果我們想要在一個(gè) SPM 倉庫里面同時(shí)放置兩種語言的代碼的話,就需要將倉庫拆分為兩個(gè) 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"]),
    ]
)

其中,倉庫文件結(jié)構(gòu)應(yīng)該為:

- MyModule
  |
  |-README.md
  |
  |-Package.swift
  |
  |-Sources
    |
    |-MyModule
    | |
    | |- MyPackage.swift  
    |
    |-MyModule_Objc
      |
      |-Include
      | |
      | |- MyObjCClass.h
      |
      |- MyObjCClass.m

Sources 文件夾拆分為兩個(gè)子文件夾,分別是兩個(gè) target 的路徑。Swift target 依賴 objc 的 target, objc 的 target 可以設(shè)置公開 header 的路徑。

這樣,objc 以及 C/C++ 這些 C 系的文件都放在 MyModule_Objc 文件夾下,Swift 文件放到 MyModule 文件夾下,就可以在同一個(gè) SPM 倉庫下實(shí)現(xiàn)混編了。

引用以及和 cocoapods 的兼容問題

在上面的 package 設(shè)置里面可以看到一行預(yù)處理宏的定義:

swiftSettings: [.define("SPM_MODE")]

這個(gè)設(shè)置是用來標(biāo)識(shí)當(dāng)前庫是通過 SPM 方式引入的。根據(jù)上文,SPM 模式下,當(dāng)前庫的 Swift 和 objc 是兩個(gè) target。因此,同一個(gè)庫的 Swift 文件想要調(diào)用 objc 文件的話,必須引入 objc 的 target:

import MyModule_Objc
// your code...

但是,我們的庫一般情況下還是要支持 cocoapods 的。在 cocoapods 模式下,同一個(gè)倉庫的 Swift 和 objc 文件是不需要拆分為兩個(gè) target 的,pod 是通過橋接文件等來實(shí)現(xiàn)兩者之間相互調(diào)用的。

那么問題就來了,當(dāng)使用 cocoapods 引入當(dāng)前庫時(shí),import MyModule_Objc 是肯定會(huì)報(bào)錯(cuò)的,因?yàn)?pod 并不會(huì)生成 MyModule_Objc。

這時(shí)候,我們在 package 文件里預(yù)先定義的宏就派上用場了:

#if SPM_MODE
import FoundationX_Objc
#endif

只有在 SPM 模式下,才會(huì) import MyModule_Objc,這樣就解決了與 cocoapods 的兼容問題。

以上就是Swift Package 技巧及混編兼容問題詳解的詳細(xì)內(nèi)容,更多關(guān)于Swift Package混編兼容的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Swift實(shí)現(xiàn)文件壓縮和解壓示例代碼

    Swift實(shí)現(xiàn)文件壓縮和解壓示例代碼

    本篇文章主要介紹了Swift實(shí)現(xiàn)文件壓縮和解壓示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Swift中swift中的switch 語句

    Swift中swift中的switch 語句

    本文給大家介紹了swift中的swift語句,以及和c語音中的寫法區(qū)別,本文介紹的非常詳細(xì),需要的朋友參考下
    2016-12-12
  • 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

    在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

    這篇文章主要介紹了在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼的方法,在一個(gè)工程中同時(shí)使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下
    2014-07-07
  • Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue

    Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue

    這篇文章主要介紹了Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下
    2016-12-12
  • Swift教程之類與結(jié)構(gòu)詳解

    Swift教程之類與結(jié)構(gòu)詳解

    這篇文章主要介紹了Swift教程之類與結(jié)構(gòu)詳解,本文講解了類和結(jié)構(gòu)的異同、結(jié)構(gòu)和枚舉類型是數(shù)值類型、類是引用類型、如何選擇使用類還是結(jié)構(gòu)、集合類型的賦值和復(fù)制操作等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 使用swift實(shí)現(xiàn)計(jì)算器功能

    使用swift實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了使用swift實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解Swift的switch...case語句中break關(guān)鍵字的用法

    詳解Swift的switch...case語句中break關(guān)鍵字的用法

    這篇文章主要介紹了Swift的switch...case語句中break關(guān)鍵字的用法,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-04-04
  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個(gè)特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實(shí)例方法,封裝特定任務(wù)和功能處理給定類型的一個(gè)實(shí)例,需要的朋友可以參考下
    2015-01-01
  • Swift 圖表使用Foudation庫中測量類型詳解

    Swift 圖表使用Foudation庫中測量類型詳解

    這篇文章主要為大家介紹了Swift 圖表使用Foudation庫中測量類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Swift?并發(fā)修改Sendable?閉包實(shí)例詳解

    Swift?并發(fā)修改Sendable?閉包實(shí)例詳解

    這篇文章主要為大家介紹了Swift?并發(fā)修改Sendable?閉包實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論

灵山县| 安图县| 康保县| 普安县| 昌宁县| 报价| 弋阳县| 沧源| 亚东县| 综艺| 灵台县| 砀山县| 大理市| 浪卡子县| 宜昌市| 百色市| 玉门市| 渝中区| 长子县| 云安县| 青州市| 尉犁县| 汶川县| 图们市| 方正县| 吉安县| 黄骅市| 泰兴市| 海口市| 太和县| 江北区| 辽阳县| 南丹县| 蚌埠市| 南部县| 彭水| 万载县| 淅川县| 宣化县| 虹口区| 松溪县|