[SwiftUI 100 天] 在 Xcode 中添加 Swift 依赖包

1,597 阅读5分钟

译自 www.hackingwithswift.com/books/ios-s…

更多内容,欢迎关注公众号 「Swift花园」

喜欢文章?不如来个 🔺💛➕三连?关注专栏,关注我 🚀🚀🚀

在 Xcode 中添加 Swift 依赖包

目前为止我们看到的代码都是我们自己从头构建的,所以你可以精确地看到代码的工作方式。不过有的时候,自起炉灶是有风险的:可能代码复杂,可能容易出错,可能变更频繁,或者有其他各种问题,这也是依赖存在的原因 —— 它能够拉取第三方代码,并且应用于我们的项目。

Xcode 自带一个依赖管理器,叫 Swift Package Manager (SPM)。你可以告诉 Xcode 线上存储的某份代码的 URL,它会为你下载代码。你还可以告诉它需要什么版本。也就是说,远程代码未来可能变化,而你可以确保这个变化不会破坏你现有的代码。

为了验证这一点,我创建了一个简单的 Swift 包,你可以导入到任意工程。这个包给 Swift 的 Sequence 类型添加了一个小小的扩展(包括 ArraySetDictionary 甚至范围都遵循这个扩展),它可以从序列的元素中一次拉出几个随机项。

言归正传,第一步是把包添加到项目:打开 File 菜单,选择 Swift Packages > Add Package Dependency。输入URL:github.com/twostraws/S… 会拉取包,读取它的配置,然后在一个新的界面上询问你需要什么版本,默认的版本是 “Version – Up to Next Major”,这是我们最常用的方式,也就是说,如果未来作者把包更新了,那么只要他没有引入会破坏当前代码编译的内容,Xcode 会自动把包更新到最新版本。

这个方式之所以可行的原因是大部分开发者都认可了一套系统的语义化版本(SemVer)来管理代码。比如 1.5.3,其中 1 是主版本号,5 是次版本号,3 是补丁版本号。如果开发者正确遵循了 SemVer,那么他们需要做到:

  • 不破坏任何 API,也不添加新特性,只修复 bug 的时候,修改补丁版本号。
  • 添加新特性,但不破坏 API 时,修改次版本号。
  • 一旦 API 不兼容,修改主版本号。

这正是为什么 “Up to Next Major” 能够很好工作的原因,它表示随着时间推移,你会得到 bug 修复和新的特性,但不会意外地切换到一个会破坏代码编译的版本。

到这里,关于包管理的版本机制就介绍完了,点击 Finish 让 Xcode 把示例包添加到工程。你会看到它出现在项目的导航器,在 “Swift Package Dependencies” 下面。

为了尝试这个包,在 ContentView.swift 里导入:

import SamplePackage

是的,我们可以任何地方以模块的方式导入我们引入的依赖包。

现在我们来尝试这个视图。举个例子,我们可以从 1 到 60 中随机选择一组数字来模拟简单的乐透,从中选择 7 个数字,转换成字符串,然后再组合成单个字符串。

首先,把 ContentView 替换成下面的代码:

struct ContentView: View {        
    var body: some View {
        Text(results)
    }
}

当然,代码不会编译通过,因为缺少 results,接下来我们来解决它。

从 1 到 60 中随机生成数字可以借助下面这样一个属性:

let possibleNumbers = Array(1...60)

然后我们要创建一个计算属性,调用 results,从中选择 7 个数字,变成字符串:

var results: String {
    // more code to come
}

我们要从范围中随机选择 7 个数字,这个需求可以借助 SamplePackage framework 里的扩展实现。它提供了一个 random() 方法,接受一个整数,从你序列中返回该整数数量的随机元素,并且随机排列。乐透数字通常是按从小到大排列,所以我们需要对随到的数字重新排序。

// more code to come 注释替换成下面的代码:

let selected = possibleNumbers.random(7).sorted()

接下来,我们需要把整数数组转换成字符串,Swift 代码只要一行代码,因为序列有一个 map() 方法,可以让我们把某个类型的数组转换成另一个类型的数组。这个过程是通过对原数组中的每个元素应用一个函数来实现的。在我们的例子中,我们要基于每个整数构建一个新字符串,所以使用 String.init()

let strings = selected.map(String.init)

到这里,strings 是一个包含从我们的范围中随机提取的数字而生成的字符串的数组,最后一步是用逗号把数组里的字符串连接起来:

return strings.joined(separator: ", ")

这样一来我们的代码就完成了:文本视图显示 results 里的值,这个值时通过选取随机数字,排序,字符串化,然后逗号连接来生成的。

PS:你可以在 Xcode 里直接阅读我的简单扩展的源代码 —— 只要打开 Sources > SamplePackage group,然后找到 SamplePackage.swift。

到此,我们就完成了这个项目的技术预研,接下来请把工程重置回原始状态。


我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~

Swift花园微信公众号