Swift Macros vs Sourcery 对比
Swift 5.9+ 编译时原生宏
VS
Sourcery
外部 Swift 代码生成工具(基于 Stencil)
8 分钟阅读iOS
评分对比
图表加载中…
详细评分
| 分类 | Swift Macros | Sourcery |
|---|---|---|
| 性能 | 9/10 | 7/10 |
| 学习难易度 | 7/10 | 8/10 |
| 生态系统 | 8/10 | 8/10 |
| 社区 | 8/10 | 9/10 |
| 就业市场 | 8/10 | 6/10 |
| 面向未来 | 10/10 | 6/10 |
优缺点
Swift Macros
优点
- Swift 编译器原生支持——完美集成
- 类型安全,语法错误在编译期就能发现
- 支持 IDE(Xcode 自动补全、跳转导航)
- 内置 @Observable、@Query、#Preview 等宏
- 在 SwiftUI、SwiftData、Testing 框架中被广泛使用
- 异步安全、线程安全
- 平台无关(iOS、macOS、Linux)
- 面向未来——Apple 官方大力推广
缺点
- 仅支持 Swift 5.9+(Xcode 15+)
- 学习曲线较陡,需要了解 SwiftSyntax API
- 调试较困难——需要通过 #expand 查看宏展开结果
- 会增加构建时间(首次构建时)
最适合
新的 Swift 5.9+ 项目SwiftUI、SwiftData 项目库/框架作者构建类型安全的 DSL遵循 Apple 官方模式(Testing 框架)
Sourcery
优点
- 兼容 Swift 5.0+(适用于老项目)
- 作为外部构建阶段——不发生在运行时
- Stencil 模板——直观易懂
- 内置 AutoMockable、AutoLenses、AutoEquatable 等注解
- 可集成到 Xcode(作为构建阶段脚本)
- 社区模板资源丰富
- 生成的代码会提交到 git(可以被审查)
- 对 Mocking 提供了广泛支持
缺点
- 属于外部依赖(不像 Swift Macros 那样原生)
- 会增加构建阶段——集成不够简洁
- 生成的文件会出现在仓库里——增加代码审查噪音
- Swift 类型系统方面的能力弱于宏
最适合
遗留 Swift 项目(5.0-5.8)大量 Mocking 需求(测试套件)跨团队减少样板代码特定的生成模式(Lens、Equatable)迁移前的过渡方案
代码对比
Swift Macros
@freestanding(expression)
public macro Color(_ hex: String) -> Color = #externalMacro(
module: "MyMacros",
type: "ColorFromHexMacro"
)
// 使用示例:
let primary = #Color("#4A90E2")
// 编译时展开 → UIColor(red: 0.29, green: 0.56, ...)Sourcery
// Sourcery 注解
// sourcery: AutoMockable
protocol UserService {
func fetchUser(id: String) async throws -> User
func updateUser(_ user: User) async throws
}
// 自动生成 —— MockUserService.generated.swift:
// class MockUserService: UserService { ... }结论
新的 Swift 5.9+ 项目 → 必选 Macros(原生、面向未来)。遗留项目(5.0-5.8)→ Sourcery 更实用。迁移路径:逐步淘汰 Sourcery,转向 Macros。预计到 2027 年 Sourcery 的使用将变得小众。
获取免费咨询常见问题
常见问题
可以,主要用 Macros,Mocking 场景搭配 Sourcery 混合使用。但理想情况下最好只用一种工具。