ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-04-01中級

Antigravity × SwiftData 実践ガイド — Core Data からの移行とデータ永続化の新標準

iOS 17 以降のデータ永続化標準 SwiftData を Antigravity の AI エージェントで効率よく実装する方法を解説。Core Data との違い、基本的な CRUD 操作、既存プロジェクトからの移行手順をコード例付きで丁寧に説明します。

SwiftDataCore DataiOS27Swift8Antigravity338app-dev47データ永続化

iOS 17 のリリースとともに登場した SwiftData は、Core Data の後継として設計された Apple の新しいデータ永続化フレームワークです。宣言的な API と Swift のマクロを活用した直感的なコードで、これまで Core Data で必要だった複雑な設定を大幅に簡略化できます。


SwiftData とは — Core Data との主な違い

SwiftData は、iOS 17 / macOS 14 以降を対象とした Apple 公式のデータ永続化フレームワークです。Core Data の内部エンジンをベースにしつつ、Swift ネイティブの API 設計が特徴で、以下の点で大きく異なります。

モデル定義の簡略化: Core Data ではモデルエディタ(.xcdatamodeld)とコード生成が必要でしたが、SwiftData では @Model マクロを付けるだけで永続化モデルが完成します。

プロパティラッパーの統合: @Query マクロを使って SwiftUI ビュー内から直接データを取得でき、FetchRequest の複雑な設定が不要になりましました。

スレッドセーフティの向上: ModelActor を使うことで、バックグラウンドコンテキストの管理がシンプルになっています。

Antigravity は Swift コードを深く理解するため、SwiftData のコード生成・リファクタリング・デバッグを AI エージェントと協力して進めることができます。


Antigravity でプロジェクトをセットアップする

まずは Antigravity 上で新しい SwiftData プロジェクトを用意します。Xcode 15 以降では、新規プロジェクト作成時に「Use SwiftData」チェックボックスが用意されています。既存プロジェクトに追加する場合は、次の手順を Antigravity に指示するとスムーズです。

Antigravity のチャット欄に以下のように入力してみてください。

既存の SwiftUI プロジェクトに SwiftData を追加したい。
まず必要なファイルの変更と新規作成の方針を教えて。

Antigravity は対象プロジェクトのファイル構成を自動スキャンし、@main エントリポイントへの modelContainer モディファイアの追加箇所や、影響を受けるビューを一覧で提示してくれます。


基本的なモデル定義と CRUD 操作

SwiftData の最小構成は非常にシンプルです。以下に、タスク管理アプリのモデル例を示します。

import SwiftData
 
// @Model マクロを付けるだけで永続化対象になる
@Model
final class Task {
    var title: String
    var isCompleted: Bool
    var createdAt: Date
    var priority: Int
 
    init(title: String, isCompleted: Bool = false, priority: Int = 0) {
        self.title = title
        self.isCompleted = isCompleted
        self.createdAt = .now
        self.priority = priority
    }
}

エントリポイントへの modelContainer 追加

import SwiftUI
import SwiftData
 
@main
struct TaskApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // Task モデルを登録する
        .modelContainer(for: Task.self)
    }
}

SwiftUI ビューでのデータ取得と操作

@Query マクロを使うと、フェッチリクエストをビューに直接埋め込めます。

import SwiftUI
import SwiftData
 
struct TaskListView: View {
    // SwiftData からタスクを自動フェッチ(更新も自動反映)
    @Query(sort: \Task.createdAt, order: .reverse)
    private var tasks: [Task]
 
    @Environment(\.modelContext) private var context
 
    var body: some View {
        List {
            ForEach(tasks) { task in
                HStack {
                    Image(systemName: task.isCompleted ? "checkmark.circle.fill" : "circle")
                        .onTapGesture {
                            // プロパティを変更するだけで永続化される
                            task.isCompleted.toggle()
                        }
                    Text(task.title)
                        .strikethrough(task.isCompleted)
                }
            }
            .onDelete { indexSet in
                for index in indexSet {
                    context.delete(tasks[index])
                }
            }
        }
        .toolbar {
            Button("追加") {
                // 新規タスクを context に挿入
                let newTask = Task(title: "新しいタスク")
                context.insert(newTask)
            }
        }
    }
}

上記のように、Core Data で必要だった NSFetchRequestNSManagedObjectContext.save() の明示的な呼び出しは不要です。Antigravity にこのコードを貼り付けて「このモデルに deadline プロパティを追加して、期限切れのタスクを赤色で表示するように変更して」と伝えるだけで、AI エージェントが差分を提示してくれます。


Core Data からの移行手順

既存の Core Data プロジェクトから移行する場合、Antigravity を使うと作業効率が格段に上がります。大まかな流れは次のとおりです。

Step 1: モデルの洗い出し

Antigravity に .xcdatamodeld ファイルを添付し、「このモデルを SwiftData の @Model クラスに変換して」と指示します。エンティティ・属性・リレーションシップがすべて Swift コードに変換されます。

Step 2: MigrationPlan の作成

Core Data のデータをそのまま引き継ぐ場合は MigrationPlan が必要です。Antigravity に「MigrationPlan を使って Core Data から SwiftData に移行するコードを書いて」と伝えると、VersionedSchemaMigrationStage を含む雛形を生成してくれます。

import SwiftData
 
enum TaskSchemaV1: VersionedSchema {
    static var versionIdentifier = Schema.Version(1, 0, 0)
    static var models: [any PersistentModel.Type] { [Task.self] }
 
    @Model
    final class Task {
        var title: String
        var isCompleted: Bool
        var createdAt: Date
 
        init(title: String) {
            self.title = title
            self.isCompleted = false
            self.createdAt = .now
        }
    }
}
 
enum TaskMigrationPlan: SchemaMigrationPlan {
    static var schemas: [any VersionedSchema.Type] { [TaskSchemaV1.self] }
    static var stages: [MigrationStage] { [] }
}

Step 3: 段階的なビューの書き換え

FetchRequest を @Query に、NSManagedObjectContext を ModelContext に置き換えていきます。Antigravity にファイルを渡して「Core Data の書き方を SwiftData スタイルに書き直して」と指示すると、差分ベースで確認しながら進められます。

実装が複雑になる場合は、アーキテクチャ全体の設計から見直すことも検討してみてください。詳しいアーキテクチャ設計については、Antigravity クリーンアーキテクチャ × DDD 実装ガイド もご参照ください。


よくあるエラーと対処法

SwiftData を使い始めると遭遇しやすいエラーをまとめましました。

「Thread 1: Fatal error: 'try!' expression 'nil' unexpectedly found」

ModelContainer の初期化失敗が原因です。スキーマの変更後にアプリを再インストールするか、deleteModelContainer してからビルドし直してください。

「@Query プロパティがプレビューでクラッシュする」

SwiftUI プレビューには別途 modelContainer を設定する必要があります。

#Preview {
    TaskListView()
        // インメモリコンテナでプレビューを動かす
        .modelContainer(for: Task.self, inMemory: true)
}

「リレーションシップの変更がビューに反映されない」

SwiftData のリレーションシップは @Relationship マクロで定義します。双方向リレーションシップを設定していない場合、変更通知が届かないことがあります。Antigravity に「このリレーションシップを双方向に設定して」と依頼すると適切なコードを生成してくれます。

iOS アプリ開発の基礎から学びたい方には、Antigravity × iOS Swift 入門 — はじめてのアプリ開発 もご覧ください。iCloud と組み合わせたデータ同期については Antigravity × SwiftUI + CloudKit:iCloud 同期アプリを本番実装するアドバンスガイド が参考になります。


全体を振り返って

SwiftData は Core Data の複雑さを解消し、Swift ネイティブの宣言的 API でデータ永続化をシンプルにしてくれるフレームワークです。@Model マクロと @Query マクロを使いこなすことで、ボイラープレートコードを大幅に削減できます。

Antigravity の AI エージェントは SwiftData の構文を深く理解しており、モデル設計・移行計画・エラー解決まで一連の作業を効率的にサポートしてくれます。Core Data からの移行を検討している方は、ぜひ Antigravity と一緒に段階的に進めてみてください。

Swift のデータ設計やアーキテクチャ

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

アプリ開発2026-06-23
StoreKit 2 で「課金したのに使えない」と言われたとき — サブスク権利状態のズレを直す運用メモ
StoreKit 2 のサブスクリプションは実装より運用でつまずきます。currentEntitlements と subscription.status のズレ、Transaction.updates の取りこぼし、未 finish トランザクション、復元と返金の扱いを、本番で効いた整流ロジックとともに記録します。
アプリ開発2026-07-04
課金済みなのに広告が消えない — StoreKit 2 の Transaction.updates を起動直後に取りこぼす競合を Antigravity と塞いだ記録
起動直後に届く StoreKit 2 のトランザクションを取りこぼす競合を、View 寿命ではなくアプリ寿命にリスナーを固定して塞いだ実装記録。currentEntitlements での照合、finish() の徹底、StoreKitTest での回帰テスト化まで。
アプリ開発2026-05-26
アプリ内レビュー要求の出し分け条件を Antigravity Editor で 5 アプリ統一した数日の記録
個人開発で運用してきた iOS 壁紙アプリ 5 本の SKStoreReviewController 呼び出し条件を、Antigravity Editor のマルチファイル編集機能でひとつの基準にまとめ直したときの数日間の所感を、コード例とあわせて静かに記録しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →