在 Xcode 中添加 Swift package 依赖

2020-09-18 10:04:16 浏览数 (1)

到目前为止,我们一直在编码的所有内容都是我们从头开始构建的内容,因此您可以确切地了解其工作原理并将这些技能应用于自己的项目。但是,有时候,从头开始写东西是有风险的:也许代码很复杂,也许很容易出错,也许它经常更改,或者其他各种原因,这就是模块依赖存在的原因——能够获取第三方代码并在我们的项目中使用它。

Xcode带有内置的依赖项管理器,称为 Swift Package Manager(SPM)。您可以告诉 Xcode 在线存储的某些代码的URL,然后它将为您下载。您甚至可以告诉它要下载的版本,这意味着如果将来将来某个时间更改远程代码,则可以确保它不会破坏您的现有代码。

为了尝试这一点,我创建了一个简单的Swift包,您可以将其导入任何项目。这为Swift的 Sequence类型(ArraySetDictionary甚至是range都符合)添加了一个小的扩展,它可以同时提取许多随机项。

无论如何,第一步是将包添加到我们的项目中:转到 File 菜单,然后选择 Swift Packages > Add Package Dependency。在URL处输入 https://github.com/twostraws/SamplePackage,这是示例包代码的存储位置。Xcode将获取该软件包,读取其配置,并向您显示一个新屏幕,询问您要使用哪个版本。默认值为 “Version – Up to Next Major”,这是最常用的版本,表示如果程序包的作者将来对其进行了更新,则只要他们不引入重大更改,Xcode就会更新该程序包。使用新版本。

之所以可能这样做,是因为大多数开发人员都已同意为其代码使用语义版本控制(SemVer)系统。如果查看类似1.5.3的版本,则将1视为主要编号,将5视为次要编号,将3视为补丁程序编号。如果开发人员正确遵循 SemVer,则他们应该:

  1. 只要不破坏任何API或添加功能,就可以在修复错误时更改补丁号。
  2. 当他们添加不会破坏任何API的功能时,请更改次版本号。
  3. 更改API时更改主版本号。

这就是“Up to Next Major”之所以如此出色的原因,因为这意味着您会随着时间的流逝获得新的错误修复和功能,但又不会意外切换到破坏代码的版本。

无论如何,我们已经完成了打包工作,因此请单击“完成”以使Xcode将其添加到项目中。您应该看到它出现在项目导航器的“Swift Package Dependencies”下。

要尝试,请打开 ContentView.swift 并将此导入添加到顶部:

代码语言:javascript复制
import SamplePackage

是的,外部依赖关系现在是一个模块,我们可以在需要的任何地方导入它。

现在,我们可以在我们看来尝试它。例如,我们可以模拟一个简单的彩票,方法是制作一个从1到60的数字范围,选择7个数字,将它们转换为字符串,然后将它们连接为一个字符串。简而言之,这将需要一些您之前从未见过的代码,因此我将对其进行分解。

首先,将当前的ContentView替换为:

代码语言:javascript复制
struct ContentView: View {        
    var body: some View {
        Text(results)
    }
}

是的,那是行不通的,因为它缺少results,但是我们现在就是在完善它。

首先,可以通过将此属性添加到ContentView来创建1到60之间的数字范围:

代码语言:javascript复制
let possibleNumbers = Array(1...60)

其次,我们将创建一个称为result的计算属性,该属性从那里选择七个数字并将它们变成单个字符串,因此也添加此属性:

代码语言:javascript复制
var results: String {
    // more code to come
}

在其中,我们将从范围中选择七个随机数,这可以使用您从SamplePackage框架获得的扩展来完成。这提供了一个random()方法,该方法接受一个整数,并将以随机顺序从您的序列中返回多达该数量的随机元素。彩票号码通常按照从小到大的顺序排列,因此我们将对其进行排序。

因此,添加以下代码行代替 // more code to come

代码语言:javascript复制
let selected = possibleNumbers.random(7).sorted()

接下来,我们需要将整数数组转换为字符串。在Swift中这只需要一行代码,因为序列具有map()方法,通过将函数应用于每个元素,我们可以将一种类型的数组转换为另一种类型的数组。在我们的例子中,我们希望从每个整数初始化一个新的字符串,因此我们可以将String.init用作要调用的函数。

因此,在上一行之后添加以下行:

代码语言:javascript复制
let strings = selected.map(String.init)

// 也许更熟悉的写法是这样
let strings = selected.map { String.init($0) }

此时,字符串是一个字符串数组,其中包含我们范围内的七个随机数,因此最后一步是将它们全部连接在一起,中间用逗号隔开。现在将此最后一行添加到属性中:

代码语言:javascript复制
return strings.joined(separator: ", ")

这就完成了我们的代码:文本视图将显示结果中的值,该结果将继续并选择随机数,对其进行排序,将它们进行字符串化,然后将其用逗号连接。

PS:您可以在Xcode内阅读我的简单扩展的源代码——只需打开 Sources> SamplePackage 组,然后查找SamplePackage.swift。您会发现它并没有做太多工作!

至此,我们完成了该项目所需的最终技术,因此,请将您的代码重置为原始状态。

删除 package

译自 Adding Swift package dependencies in Xcode

0 人点赞