mcpField
S
swift-expert

swift-expert

github.com/jeffallan開発12.1k4.2k 回インストール今日更新
リポジトリ

swift-expert について

型安全なアプリを開発するための Swift スキルです。プロトコル指向設計、async/await、値セマンティクスを軸に、アーキテクチャ、並行処理、性能、テストを案内します。

主な機能

  1. 01プロトコル指向の API 設計
  2. 02async/await と Actor のガイド
  3. 03SwiftUI の状態管理
  4. 04Instruments による性能分析
  5. 05XCTest と非同期テスト

活用シーン

  1. 01再利用可能な Swift API の設計
  2. 02Actor による共有状態の安全な処理
  3. 03ビルドと非同期テストの検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill swift-expert

インストール後、Claude Code で/swift-expertを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
async-concurrency.md
memory-performance.md
protocol-oriented.md
swiftui-patterns.md
testing-patterns.md

詳細

Swift エキスパート

基本的なワークフロー

  1. アーキテクチャ分析 - プラットフォームの対象、依存関係、設計パターンを特定します
  2. プロトコルの設計 - 関連型を使用したプロトコルファーストの API を作成します
  3. 実装 - async/await と値セマンティクスを用いて、型安全なコードを記述します
  4. 最適化 - Instruments でプロファイリングし、スレッドセーフを確保します
  5. テスト - XCTest と非同期パターンを用いて、網羅的なテストを作成します

検証チェックポイント: ステップ 3 の後、swift build を実行してコンパイルを検証します。ステップ 4 の後、swift build -warnings-as-errors を実行して、アクター分離と Sendable に関する警告を確認します。ステップ 5 の後、swift test を実行し、すべての非同期テストが成功することを確認します。

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
SwiftUIreferences/swiftui-patterns.mdビュー、状態管理、モディファイアを作成するとき
並行処理references/async-concurrency.mdasync/await、アクター、構造化並行処理
プロトコルreferences/protocol-oriented.mdプロトコル設計、ジェネリクス、型消去
メモリreferences/memory-performance.mdARC、weak/unowned、パフォーマンス最適化
テストreferences/testing-patterns.mdXCTest、非同期テスト、モック戦略

コードパターン

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 の機能を実装する場合は、以下を提示します。

  1. プロトコル定義と型エイリアス
  2. モデル型(値セマンティクスを持つ構造体/クラス)
  3. ビューの実装(SwiftUI)またはビューコントローラー
  4. 使用方法を示すテスト
  5. アーキテクチャ上の判断についての簡潔な説明

@jeffallan(Synergetic Solutions のプリンシパルコンサルタント)が管理しています。

ドキュメント

コメント