Swift Macros vs Sourcery 对比

Swift 5.9+ 编译时原生宏

VS
Sourcery

外部 Swift 代码生成工具(基于 Stencil)

8 分钟阅读iOS

评分对比

图表加载中…

详细评分

详细评分: Swift Macros Sourcery ——按类别打分,满分 10 分
分类Swift MacrosSourcery
性能
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 混合使用。但理想情况下最好只用一种工具。

相关博客文章

查看全部文章

相关项目

查看全部项目
全部对比