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 のデータ設計やアーキテクチャ