swift-actor-persistence
Swiftでアクターを使用してスレッドセーフなデータ永続化レイヤーを構築する場合に使用します。メモリ内キャッシュとファイルストレージの両方に対応しており、データの安全な読み書きが可能です。
description の原文を見る
Use when building a thread-safe data persistence layer in Swift using actors with in-memory cache and file storage.
SKILL.md 本文
Swift Actorによるスレッドセーフな永続化
抽出日: 2026-02-05 コンテキスト: async/awaitを使用したスレッドセーフなデータ永続化が必要なiOS/Swiftアプリ
課題
データ永続化レイヤーは、アプリの複数の部分が同時に読み書きする際にレースコンディションに直面することが多い。従来のアプローチ(DispatchQueues、ロック)はエラーが発生しやすく、冗長になりがち。
解決策
Swift actorを使用して、すべての永続化状態と操作を分離する。actorモデルは以下を保証します:
- データ競合なし(コンパイラによる強制)
- アクセスの自動シリアライズ
- 構造化並行性と統合されたasyncファーストAPI
public actor LocalRepository {
private var cache: [String: Record] = [:]
private let cacheFileURL: URL
public init(directory: URL = .documentsDirectory) {
self.cacheFileURL = directory.appendingPathComponent("cache.json")
// Synchronous cache load during init (actor isolation not yet active)
self.cache = Self.loadCacheSynchronously(from: cacheFileURL)
}
public func save(_ record: Record) throws {
cache[record.id] = record
try persistToFile()
}
public func loadAll() -> [Record] {
Array(cache.values)
}
public func find(by id: String) -> Record? {
cache[id]
}
private func persistToFile() throws {
let data = try JSONEncoder().encode(Array(cache.values))
try data.write(to: cacheFileURL)
}
private static func loadCacheSynchronously(from url: URL) -> [String: Record] {
guard let data = try? Data(contentsOf: url),
let records = try? JSONDecoder().decode([Record].self, from: data) else {
return [:]
}
return Dictionary(uniqueKeysWithValues: records.map { ($0.id, $0) })
}
}
主要パターン
- インメモリキャッシュ + ファイル永続化: キャッシュからの高速読み取り、ディスクへの永続書き込み
- 同期的な初期化読み込み: 非同期初期化の複雑さを回避
- Dictionary型によるキー管理: IDによるO(1)の検索
- プライベートな永続化: 外部呼び出し元はドメイン操作のみを参照
使用方法
let repository = LocalRepository()
// All calls are async due to actor isolation
let records = await repository.loadAll()
try await repository.save(newRecord)
let found = await repository.find(by: "question-1")
使用すべき場面
- Swift 5.5以降でデータ永続化レイヤーを構築する場合
- 共有状態へのスレッドセーフなアクセスが必要な場合
- 手動同期(ロック、キュー)を避けたい場合
- ローカルストレージを使用したオフラインファーストアプリを構築する場合
関連パターン
- UIバインディング用に
@ObservableViewModelと組み合わせる - actor境界を越えるデータには
Sendable型を使用する - クラウド同期操作には
FileBasedSyncManageractorを検討する
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- majiayu000
- ライセンス
- MIT
- 最終更新
- 2026/5/9
Source: https://github.com/majiayu000/claude-skill-registry-data / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。