SwiftData Basics 极简入门

SwiftData 真的好简单,不过话说 iOS 17 苹果推出的很多属性包装器真的很像Java里的注解。

请使用Xcode15运行
模型定义

import Foundation
import SwiftData

@Model // 真的太像注解了
class DataItem:Identifiable {
    var id:String
    var name:String
    
    init(name: String) {
        self.id = UUID().uuidString
        self.name = name
    }
}

模型引入

import SwiftUI
import SwiftData

@main
struct SwiftDataDemoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for:DataItem.self)// 这里和Environment变量的使用方式也非常类似
    }
}

模型使用

import SwiftUI
import SwiftData
struct ContentView: View {
    
    @Environment(\.modelContext) private var context // 上下文
    
    @Query private var items:[DataItem]  // 查询
    
    var body: some View {
        VStack {
            Text("Tag on this button to add data")
            Button("Add an item"){
                addItem()
            }
            
            List{
                ForEach(items) { item in
                    HStack{
                        Text(item.name)
                        Spacer()
                        Button(action: {
                            updateItem(item)
                        }, label: {
                            Image(systemName: "arrow.counterclockwise.circle")
                        })
                    }
                }
                .onDelete(perform: { indexSet in
                    for index in indexSet {
                        deleteItem(items[index])
                    }
                })
            }
        }
        .padding()
    }
    
    func addItem() {
        let item = DataItem(name: "Test item")
        context.insert(item) // 增加
    }
    
    func deleteItem(_ item:DataItem){
        context.delete(item) // 删除
    }
    
    func updateItem(_ item:DataItem){
        item.name = "Update Test item"
        try? context.save() // 修改保存
    }
}

#Preview {
    ContentView()
}