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にコミットでき、内容を検査可能
- モック生成に対する充実したサポート
短所
- 外部依存(Swift Macrosはネイティブ)
- ビルドフェーズが追加され、よりクリーンな統合はできない
- 生成ファイルがリポジトリに含まれ、レビュー時のノイズになる
- Swiftの型システムに関する制約がある(マクロより弱い)
最適な用途
レガシーなSwiftプロジェクト(5.0〜5.8)大規模なモック生成(テストスイート)チーム横断的なボイラープレート削減特定の生成パターン(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の利用はニッチになると予想されます。
無料相談を受けるFAQ
よくある質問
はい、Macrosをメインに、Sourceryをモック生成用途でハイブリッドに使うことは可能です。ただし理想的には単一ツールに絞ることが望ましいです。