到目前为止,我们一直在编码的所有内容都是我们从头开始构建的内容,因此您可以确切地了解其工作原理并将这些技能应用于自己的项目。但是,有时候,从头开始写东西是有风险的:也许代码很复杂,也许很容易出错,也许它经常更改,或者其他各种原因,这就是模块依赖存在的原因——能够获取第三方代码并在我们的项目中使用它。
Xcode带有内置的依赖项管理器,称为 Swift Package Manager(SPM)。您可以告诉 Xcode 在线存储的某些代码的URL,然后它将为您下载。您甚至可以告诉它要下载的版本,这意味着如果将来将来某个时间更改远程代码,则可以确保它不会破坏您的现有代码。
为了尝试这一点,我创建了一个简单的Swift包,您可以将其导入任何项目。这为Swift的 Sequence
类型(Array
,Set
,Dictionary
甚至是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,则他们应该:
- 只要不破坏任何API或添加功能,就可以在修复错误时更改补丁号。
- 当他们添加不会破坏任何API的功能时,请更改次版本号。
- 更改API时更改主版本号。
这就是“Up to Next Major”之所以如此出色的原因,因为这意味着您会随着时间的流逝获得新的错误修复和功能,但又不会意外切换到破坏代码的版本。
无论如何,我们已经完成了打包工作,因此请单击“完成”以使Xcode将其添加到项目中。您应该看到它出现在项目导航器的“Swift Package Dependencies”下。
要尝试,请打开 ContentView.swift 并将此导入添加到顶部:
代码语言:javascript复制import SamplePackage
是的,外部依赖关系现在是一个模块,我们可以在需要的任何地方导入它。
现在,我们可以在我们看来尝试它。例如,我们可以模拟一个简单的彩票,方法是制作一个从1到60的数字范围,选择7个数字,将它们转换为字符串,然后将它们连接为一个字符串。简而言之,这将需要一些您之前从未见过的代码,因此我将对其进行分解。
首先,将当前的ContentView
替换为:
struct ContentView: View {
var body: some View {
Text(results)
}
}
是的,那是行不通的,因为它缺少results
,但是我们现在就是在完善它。
首先,可以通过将此属性添加到ContentView
来创建1到60之间的数字范围:
let possibleNumbers = Array(1...60)
其次,我们将创建一个称为result
的计算属性,该属性从那里选择七个数字并将它们变成单个字符串,因此也添加此属性:
var results: String {
// more code to come
}
在其中,我们将从范围中选择七个随机数,这可以使用您从SamplePackage
框架获得的扩展来完成。这提供了一个random()
方法,该方法接受一个整数,并将以随机顺序从您的序列中返回多达该数量的随机元素。彩票号码通常按照从小到大的顺序排列,因此我们将对其进行排序。
因此,添加以下代码行代替 // more code to come
:
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