🕷️

【SwiftData】様々な型のデータを管理できる汎用的なクラスの作成

2024/07/08に公開

はじめに

コードの再利用性を高め、アプリケーション全体のデータ管理の簡素化を目的としています。

コード

import SwiftData

class ModelManager<T: PersistentModel> {
    private var container: ModelContainer?
    
    init() {
        self.container = try? ModelContainer(for: T.self)
    }
    
    func deleteAll() async {
        guard let container = self.container else { return }
        
        let context = ModelContext(container)
        
        do {
            try context.delete(model: T.self)
            try context.save()
        } catch {
            print("全データの削除に失敗しました: \(error)")
        }
    }
    
    func addItem(data: T) async {
        guard let container = self.container else { return }
        
        let context = ModelContext(container)
        
        context.insert(data)
        
        do {
            try context.save()
        } catch {
            print("データの保存に失敗しました: \(error)")
        }
    }
    
    func fetchAll() -> [T] {
        guard let container = self.container else { return [] }
        
        let context = ModelContext(container)
        
        do {
            let descriptor = FetchDescriptor<T>()
            return try context.fetch(descriptor)
        } catch {
            print("データの取得に失敗しました: \(error)")
            return []
        }
    }
}

使用例

import SwiftData

@Model
class User {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
// インスタンスの作成
let userManager = ModelManager<User>()
// ユーザーの追加
await userManager.addItem(User(name: "Alice", age: 30))
// すべてのユーザーの取得
let allUsers = userManager.fetchAll()
// すべてのユーザーの削除
await userManager.deleteAll()

参考

Discussion