iOS数据持久化的框架SwiftData

SwiftData 是 Apple 在 WWDC 2023 推出的一个用于数据持久化的框架,它结合了 Swift 的语言特性,提供了一种更易于使用且类型安全的方式来管理本地存储的数据。SwiftData 类似于 Core Data,但更加简洁,适合现代 Swift 开发者的需求。

核心特性

  1. 声明式语法:使用 Swift 的属性包装器 @Model 来定义模型。
  2. 类型安全:数据模型直接映射为 Swift 类型。
  3. 轻量级的上下文管理:使用 ModelContext 来管理数据,简化了 Core Data 中上下文的概念。
  4. 对 SwiftUI 的深度集成:可以与 SwiftUI 的数据流无缝结合。

一个简单的 SwiftData 示例

实现一个待办事项应用

1. 引入 SwiftData

确保你的项目最低支持 iOS 17,且 SwiftData 已导入。

import SwiftUI
import SwiftData

2. 定义数据模型

使用 @Model 来声明你的数据模型。

@Model
class TodoItem {
    @Attribute(.unique) var id: UUID
    var title: String
    var isCompleted: Bool

    init(title: String, isCompleted: Bool = false) {
        self.id = UUID()
        self.title = title
        self.isCompleted = isCompleted
    }
}

3. 构建数据上下文

在应用的入口处,创建 ModelContainer。

@main
struct TodoApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .modelContainer(for: TodoItem.self)
        }
    }
}

4. 实现主界面

使用 SwiftUI 和 SwiftData 展示待办事项列表。

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

    @State private var newTodoTitle = ""

    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    TextField("Add a new task", text: $newTodoTitle)
                        .textFieldStyle(RoundedBorderTextFieldStyle())
                    Button("Add") {
                        addTodoItem()
                    }
                    .disabled(newTodoTitle.isEmpty)
                }
                .padding()

                List {
                    ForEach(todoItems) { item in
                        HStack {
                            Text(item.title)
                                .strikethrough(item.isCompleted)
                            Spacer()
                            Button(action: {
                                toggleCompletion(for: item)
                            }) {
                                Image(systemName: item.isCompleted ? "checkmark.circle.fill" : "circle")
                            }
                        }
                    }
                    .onDelete(perform: deleteTodoItem)
                }
                .listStyle(.plain)
            }
            .navigationTitle("Todo List")
        }
    }

    private func addTodoItem() {
        let newItem = TodoItem(title: newTodoTitle)
        modelContext.insert(newItem)
        newTodoTitle = ""
    }

    private func toggleCompletion(for item: TodoItem) {
        item.isCompleted.toggle()
    }

    private func deleteTodoItem(at offsets: IndexSet) {
        for index in offsets {
            let item = todoItems[index]
            modelContext.delete(item)
        }
    }
}

运行结果

  1. 启动应用后,界面上显示一个待办事项输入框和一个任务列表。
  2. 用户可以输入任务名称,点击 Add 按钮将任务添加到列表。
  3. 列表中的任务可以通过点击标记完成状态,或向左滑动删除。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容