SwiftData 是 Apple 在 WWDC 2023 推出的一个用于数据持久化的框架,它结合了 Swift 的语言特性,提供了一种更易于使用且类型安全的方式来管理本地存储的数据。SwiftData 类似于 Core Data,但更加简洁,适合现代 Swift 开发者的需求。
核心特性
-
声明式语法:使用 Swift 的属性包装器
@Model
来定义模型。 - 类型安全:数据模型直接映射为 Swift 类型。
-
轻量级的上下文管理:使用
ModelContext
来管理数据,简化了 Core Data 中上下文的概念。 - 对 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)
}
}
}
运行结果
- 启动应用后,界面上显示一个待办事项输入框和一个任务列表。
- 用户可以输入任务名称,点击 Add 按钮将任务添加到列表。
- 列表中的任务可以通过点击标记完成状态,或向左滑动删除。