Sourcery for Swift:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Sourcery for Swift:代码生成完整指南

\n\n

1. 这是什么?为什么需要它?

\n

Sourcery 是 Swift 语言的一个强大代码生成工具,由 Krzysztof Zabłocki 及其团队创建。它能够基于注释和源文件的结构自动生成样板代码(boilerplate code)。您无需手动编写重复的协议实现、Equatable、Hashable、Codable、测试用的 mock 对象或 Auto Layout 相关代码,只需一次性定义生成规则,Sourcery 便会完成其余工作。

\n\n

为什么需要它?在实际的 Swift 项目中,大量代码是机械且重复的。这不仅耗费开发者的时间,也是错误的来源:例如忘记在 Equatable 中添加新字段,就会导致 bug。Sourcery 通过接管这些繁琐工作来解决此问题。它分析您的代码(AST——抽象语法树),并基于模板(Stencil 或基于 Swift 的模板)生成新文件。这在拥有数十甚至数百个模型、ViewController 或服务的大型项目中尤为有用。

\n\n

Sourcery 并非运行时库——它是一个编译时工具。您将其作为构建过程的一部分运行(通过 Xcode 的 Build Phase 或通过 SPM/Tuist),它会生成文件,然后这些文件与其余代码一起编译。这种方法保证了零运行时开销和完全的可预测性。

\n\n

2. 安装

\n

安装 Sourcery 有多种方式。最简单且推荐的方式是通过 Homebrew:

\n
brew install sourcery
\n\n

对于使用 Swift Package Manager (SPM) 的项目,可以将 Sourcery 作为插件添加。但更常见的是将其作为独立的二进制文件,从构建脚本中调用。通过 Mint(Swift 工具的包管理器)安装:

\n
mint install krzysztofzablocki/Sourcery
\n\n

您也可以从 GitHub Releases 下载预编译的二进制文件,并将其放入项目文件夹。安装后,请确保命令可用:

\n
sourcery --version
\n\n

3. 快速入门——最小工作示例

\n

让我们创建一个简单示例:为结构体自动生成 Equatable 协议的实现。

\n\n

步骤 1:创建源代码文件(例如 Sources/Models/User.swift):

\n
import Foundation\n\n// sourcery: AutoEquatable\nstruct User {\n    let id: Int\n    let name: String\n    let email: String\n}
\n\n

注意注释 // sourcery: AutoEquatable——这是一个注解,告诉 Sourcery 需要为该结构体生成 Equatable 实现。

\n\n

步骤 2:创建模板(例如 Templates/AutoEquatable.stencil):

\n
// Generated by Sourcery\n// swiftlint:disable all\n\n{% for type in types.all where type.annotations.AutoEquatable %}\nextension {{ type.name }}: Equatable {\n    static func == (lhs: {{ type.name }}, rhs: {{ type.name }}) -> Bool {\n        {% for variable in type.storedVariables %}\n        {% if not forloop.first %} && {% endif %}lhs.{{ variable.name }} == rhs.{{ variable.name }}\n        {% endfor %}\n    }\n}\n{% endfor %}
\n\n

步骤 3:运行 Sourcery:

\n
sourcery --sources Sources/Models --templates Templates --output Generated
\n\n

步骤 4:结果——在 Generated 文件夹中会生成文件 AutoEquatable.generated.swift:

\n
// Generated by Sourcery\                    

推荐