コンテンツにスキップ

SwiftData の ModelContainer の書き方 3パターンまとめ

  1. .modelContainer(for:) を使う簡易版
  2. ModelContainer を自分で生成して渡す版
  3. Schema / ModelConfiguration まで明示する版

1. .modelContainer(for:) を使う簡易版

コード例

import SwiftUI
import SwiftData

@main
struct YourAppApp: App {
    var body: some Scene {
        WindowGroup {
            RootView()
        }
        .modelContainer(for: Alarm.self)
    }
}

特徴

  • 最もシンプルな書き方
  • SwiftUI 側の便利APIを使っている
  • Alarm を SwiftData の永続化対象として登録できる
  • modelContext@Query がそのまま使える

向いているケース

  • SwiftData を始めたばかり
  • 小規模アプリ
  • 保存設定を細かく触らない
  • まずは動くものを作りたい

メリット

  • 記述が少ない
  • 読みやすい
  • 学習しやすい

デメリット

  • Container の生成を自分で管理しにくい
  • 保存設定を細かく制御しにくい

2. ModelContainer を自分で生成して渡す版

コード例

import SwiftUI
import SwiftData

@main
struct YourAppApp: App {
    let container: ModelContainer

    init() {
        do {
            container = try ModelContainer(for: Alarm.self)
        } catch {
            fatalError("ModelContainerの生成に失敗しました: \(error)")
        }
    }

    var body: some Scene {
        WindowGroup {
            RootView()
        }
        .modelContainer(container)
    }
}

特徴

  • ModelContainer を自分で生成して保持する
  • 最終的には .modelContainer(container) で View 階層に渡す
  • 1番より少し明示的な書き方

向いているケース

  • Container の生成処理を app 側で管理したい
  • DIっぽく扱いたい
  • Preview / Test 用に差し替えたい
  • 生成失敗時の処理を自分で書きたい

メリット

  • Container を変数として保持できる
  • 将来的な拡張に備えやすい
  • app 初期化処理として分かりやすい

デメリット

  • 1番より少しコード量が増える
  • 設定を明示していない場合、実質的には1番とかなり近い

3. Schema / ModelConfiguration まで明示する版

コード例

import SwiftData

var sharedModelContainer: ModelContainer = {
    let schema = Schema([
        Item.self,
    ])
    let modelConfiguration = ModelConfiguration(
        schema: schema,
        isStoredInMemoryOnly: false
    )

    do {
        return try ModelContainer(
            for: schema,
            configurations: [modelConfiguration]
        )
    } catch {
        fatalError("Could not create ModelContainer: \(error)")
    }
}()

特徴

  • Schema を自分で定義する
  • ModelConfiguration を自分で作る
  • ModelContainer を設定付きで生成する
  • 3パターンの中で最も柔軟

何を明示しているか

  • Schema
  • この Container が扱う Model の集合
  • ModelConfiguration
  • 保存方式や保存先に関する設定
  • ModelContainer
  • 上記設定を使って生成された永続化コンテナ

向いているケース

  • 複数 Model を明示的に扱いたい
  • in-memory / on-disk を切り替えたい
  • 保存構成を細かく制御したい
  • 将来的な拡張を見据えている

メリット

  • 最も柔軟
  • 保存構成を明確に管理できる
  • テストや本番で設定を切り替えやすい

デメリット

  • コード量が最も多い
  • 初学者には少し重い
  • 小規模アプリではオーバースペックになることがある

3つの違いを一言でまとめると

1番

おまかせ簡易版

2番

おまかせ寄りだが、Container の生成は自分で管理する版

3番

Schema / Configuration まで自分で定義する本格版


どれを選ぶべきか

小規模アプリ・学習用

1番 がおすすめ

.modelContainer(for: Alarm.self)

Container を app 側で管理したい

2番 がおすすめ

保存設定を細かく制御したい

3番 がおすすめ


まとめ

  • 1番: 最小構成、簡単、今のプロジェクト向き
  • 2番: Container の生成を自分で管理したいとき向き
  • 3番: Schema や Configuration を細かく制御したいとき向き