swift-expert について
型安全なアプリを開発するための Swift スキルです。プロトコル指向設計、async/await、値セマンティクスを軸に、アーキテクチャ、並行処理、性能、テストを案内します。
主な機能
- 01プロトコル指向の API 設計
- 02async/await と Actor のガイド
- 03SwiftUI の状態管理
- 04Instruments による性能分析
- 05XCTest と非同期テスト
活用シーン
- 01再利用可能な Swift API の設計
- 02Actor による共有状態の安全な処理
- 03ビルドと非同期テストの検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill swift-expertインストール後、Claude Code で/swift-expertを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/async-concurrency.mdmemory-performance.mdprotocol-oriented.mdswiftui-patterns.mdtesting-patterns.md詳細
Swift エキスパート
基本的なワークフロー
- アーキテクチャ分析 - プラットフォームの対象、依存関係、設計パターンを特定します
- プロトコルの設計 - 関連型を使用したプロトコルファーストの API を作成します
- 実装 - async/await と値セマンティクスを用いて、型安全なコードを記述します
- 最適化 - Instruments でプロファイリングし、スレッドセーフを確保します
- テスト - XCTest と非同期パターンを用いて、網羅的なテストを作成します
検証チェックポイント: ステップ 3 の後、
swift buildを実行してコンパイルを検証します。ステップ 4 の後、swift build -warnings-as-errorsを実行して、アクター分離と Sendable に関する警告を確認します。ステップ 5 の後、swift testを実行し、すべての非同期テストが成功することを確認します。
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| SwiftUI | references/swiftui-patterns.md | ビュー、状態管理、モディファイアを作成するとき |
| 並行処理 | references/async-concurrency.md | async/await、アクター、構造化並行処理 |
| プロトコル | references/protocol-oriented.md | プロトコル設計、ジェネリクス、型消去 |
| メモリ | references/memory-performance.md | ARC、weak/unowned、パフォーマンス最適化 |
| テスト | references/testing-patterns.md | XCTest、非同期テスト、モック戦略 |
コードパターン
async/await — 正しい例と誤った例
// ✅ DO: async/await with structured error handling
func fetchUser(id: String) async throws -> User {
let url = URL(string: "https://api.example.com/users/\(id)")!
let (data, _) = try await URLSession.shared.data(from: url)
return try JSONDecoder().decode(User.self, from: data)
}
// ❌ DON'T: mixing completion handlers with async context
func fetchUser(id: String) async throws -> User {
return try await withCheckedThrowingContinuation { continuation in
// Avoid wrapping existing async APIs this way when a native async version exists
legacyFetch(id: id) { result in
continuation.resume(with: result)
}
}
}
SwiftUI の状態管理
// ✅ DO: use @Observable (Swift 5.9+) for view models
@Observable
final class CounterViewModel {
var count = 0
func increment() { count += 1 }
}
struct CounterView: View {
@State private var vm = CounterViewModel()
var body: some View {
VStack {
Text("\(vm.count)")
Button("Increment", action: vm.increment)
}
}
}
// ❌ DON'T: reach for ObservableObject/Published when @Observable suffices
class LegacyViewModel: ObservableObject {
@Published var count = 0 // Unnecessary boilerplate in Swift 5.9+
}
プロトコル指向アーキテクチャ
// ✅ DO: define capability protocols with associated types
protocol Repository<Entity> {
associatedtype Entity: Identifiable
func fetch(id: Entity.ID) async throws -> Entity
func save(_ entity: Entity) async throws
}
struct UserRepository: Repository {
typealias Entity = User
func fetch(id: UUID) async throws -> User { /* … */ }
func save(_ user: User) async throws { /* … */ }
}
// ❌ DON'T: use classes as base types when a protocol fits
class BaseRepository { // Avoid class inheritance for shared behavior
func fetch(id: UUID) async throws -> Any { fatalError("Override required") }
}
スレッドセーフを実現するアクター
// ✅ DO: isolate mutable shared state in an actor
actor ImageCache {
private var cache: [URL: UIImage] = [:]
func image(for url: URL) -> UIImage? { cache[url] }
func store(_ image: UIImage, for url: URL) { cache[url] = image }
}
// ❌ DON'T: use a class with manual locking
class UnsafeImageCache {
private var cache: [URL: UIImage] = [:]
private let lock = NSLock() // Error-prone; prefer actor isolation
func image(for url: URL) -> UIImage? {
lock.lock(); defer { lock.unlock() }
return cache[url]
}
}
制約
必ず行うこと
- 型ヒントと型推論を適切に使用します
- Swift API デザインガイドラインに従います
- 非同期処理には
async/awaitを使用します(上記のパターンを参照) - 並行処理で
Sendableへの準拠を確保します - 既定では値型(
struct/enum)を使用します - マークアップコメント(
/// …)で API をドキュメント化します - 横断的関心事にはプロパティラッパーを使用します
- 最適化の前に Instruments でプロファイリングします
絶対に行わないこと
- 正当な理由なく強制アンラップ(
!)を使用します - クロージャーで循環参照を作成します
- 同期コードと非同期コードを不適切に混在させます
- アクター分離の警告を無視します
- 不要な暗黙的アンラップオプショナルを使用します
- エラー処理を省略します
- Swift に代替手段がある場合に Objective-C のパターンを使用します
- プラットフォーム固有の値をハードコードします
出力テンプレート
Swift の機能を実装する場合は、以下を提示します。
- プロトコル定義と型エイリアス
- モデル型(値セマンティクスを持つ構造体/クラス)
- ビューの実装(SwiftUI)またはビューコントローラー
- 使用方法を示すテスト
- アーキテクチャ上の判断についての簡潔な説明
@jeffallan(Synergetic Solutions のプリンシパルコンサルタント)が管理しています。
コメント
Markdown 対応