SwiftData の ModelContainer の書き方 3パターンまとめ¶
.modelContainer(for:)を使う簡易版ModelContainerを自分で生成して渡す版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 を細かく制御したいとき向き