LESSON 05 / 575 分钟

Swift Package Manager 与工程组织

先用系统框架完成核心功能;当复用边界明确时,再引入包或拆模块。

用你的前端经验理解

SPM 类似包管理器;Package.swift 类似包清单。它管理产品、Target 和依赖,不是直接安装 npm 包。

为什么需要它

包管理解决复用和依赖边界,不负责替你设计架构。对一个阅读 App,网址格式化函数可能只需独立文件;当同一逻辑被 iOS、macOS 和测试共同使用,且不依赖 UI 时,提取为 Swift Package 才开始有收益。过早拆包会增加访问控制、平台配置和构建维护成本。

它是怎样工作的

Swift Package 可以定义多个 Target,再以 product 对外暴露可使用的库。App 依赖某个产品,源码通过 import 访问模块;模块中的类型与成员还必须具有合适的可见性。版本约束表达允许升级的范围,解析记录帮助团队使用一致依赖。引入前还需核对平台、最低系统版本、许可证和传递依赖。

把关键概念连起来

1

依赖

在 Xcode 中添加 Package Dependency,明确版本约束,并审查维护状态、许可与平台支持。

2

模块

import 引入模块,public 才向模块外公开;internal 默认在同模块内可访问。

3

组织

小项目按 Feature 分目录,页面、模型、服务靠近功能。独立可测试逻辑再提取到 Swift Package。

把阅读时长计算移入共享模块

  1. 先写一个只接收字数并返回分钟数的纯函数,不让它读取单例、当前窗口或数据库。
  2. 在包里公开类型、初始化器和方法;仅把 struct 标为 public 而遗漏成员访问级别,App 仍可能无法调用。
  3. 给零字数、正常文章和异常输入规定结果,并在包测试里验证。随后由两个 App Target 导入同一产品。

这里需要你亲自判断

不要为了一个小工具引入复杂状态框架;依赖的最低系统版本也会影响你的 App。

做一个小练习

把一个纯 Swift 格式化函数放进独立文件;说明它是否值得提取成包。

  1. 判断网址解析、页面导航、数据库连接中哪些适合共享包,并解释依赖方向。
  2. 在提交记录里查看新增包带来了哪些间接依赖与平台要求。
展开参考思路与验收标准

共享包应依赖稳定的输入输出,而不是反向依赖具体 App 的 View。一个可以在不启动 UI 的情况下测试的阅读时长函数,是比“所有文件放入 Core 包”更清楚的模块边界。

想让包里的类型被 App 访问,应关注哪个访问级别?

继续查阅官方资料
Swift 官方文档

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成