用途

データを保存するのに SwiftData を使用し、初回アプリ起動時にモデルへの初期データを作成します。

モデルのレコードが0件の時に初期データを作成しています。

実行時の例

image.png

プロジェクトの作成時

Storage : SwiftData を選択しておきます。

image.png

image.png

Category は、モデルクラスです。

ContentView には、Category を読み込みし、リスト表示しています。

初期データの作成処理も含みます。

//
//  Category.swift
//  SwiftDataTest02
//
//  Created by Rue on 2024/10/02.
//

import Foundation
import SwiftData

@Model
final class Category {
    var name: String
    
    init(name: String) {
        self.name = name
    }
}

初期データの作成条件は、モデルのレコード数が0件(Empty:空)の時にしています。

データを一旦取得後に判定しますが、もっと良い方法があるかも知れません。。。

//
//  ContentView.swift
//  SwiftDataTest02
//
//  Created by Rue on 2024/10/02.
//

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\\.modelContext) private var modelContext
    @Query private var categories: [Category]

    var body: some View {
        // レコードが0件の時に初期データを作成します。
        if categories.isEmpty {
            // 直接関数の実行ができないので、
            // onAppear でコントール表示されるタイミングで
            // 初期データの作成を呼び出しています。
            Text("初期データを読み込み中です...")
                .onAppear() {
                    createInitCategories()
                }
        }
        else {
            List(categories) { category in
                Text(category.name)
            }
        }
    }
    
    /// 初期データの作成
    func createInitCategories() {
        let items = [
            Category(name: "果物"),
            Category(name: "野菜"),
            Category(name: "魚"),
            Category(name: "肉"),
            Category(name: "調味料"),
        ]
        for item in items {
            modelContext.insert(item)
        }
    }
}

#Preview {
    ContentView()
        // 作成したモデルクラスをforに設定
        .modelContainer(for: Category.self, inMemory: true)
}

プロジェクトソースで使用するモデルを ModelConfiguration に渡しています。

//
//  SwiftDataTest02App.swift
//  SwiftDataTest02
//
//  Created by Rue on 2024/10/02.
//

import SwiftUI
import SwiftData

@main
struct SwiftDataTest02App: App {
    var sharedModelContainer: ModelContainer = {
        let schema = Schema([
            // 作成したモデルクラスを追加
            Category.self,
        ])
        let modelConfiguration = ModelConfiguration(schema: schema, isStoredInMemoryOnly: false)

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

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(sharedModelContainer)
    }
}