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

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

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

SwiftDataCore DataiOS27Swift8Antigravity386app-dev52データ永続化

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 で必要だった NSFetchRequest や NSManagedObjectContext.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 に移行するコードを書いて」と伝えると、VersionedSchema と MigrationStage を含む雛形を生成してくれます。

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-05-25
Antigravity の Inline Edit と Agent モードを壁紙アプリ運用で1ヶ月使い分けた所感
壁紙アプリ4本の実運用で Antigravity の Inline Edit と Agent モードを1ヶ月使い分けた所感です。実測値・AGENTS.md への判断軸の固定・dSYM 一括統一・クレジット消費まで、現実的な運用設計を共有します。
▣ アプリ開発2026-03-18
Antigravity で SwiftUI × CloudKit の iCloud 同期アプリを本番実装する
SwiftUI と CloudKit を Antigravity で組み合わせ、デバイス間リアルタイム同期の iOS アプリを本番実装します。CKRecord 設計、オフライン対応、queryable インデックスとスキーマ昇格の落とし穴まで、実装の判断ごとに整理しました。
▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。