在SwiftUI应用开发中,状态持久化是提升用户体验的关键环节。本文将分享一个完整的待办事项应用示例,展示如何实现状态的持久化存储。
核心思路
我们采用UserDefaults作为本地存储方案,结合@StateObject和@ObservedObject来管理应用状态。通过创建一个TodoStore类来封装数据读写逻辑。
代码实现
首先定义待办事项模型:
struct TodoItem: Codable {
let id = UUID()
var title: String
var isCompleted: Bool
var createdAt: Date
}
创建状态管理类:
@MainActor
class TodoStore: ObservableObject {
@Published var todos: [TodoItem] = []
private let userDefaultsKey = "SavedTodos"
init() {
loadTodos()
}
func addTodo(_ title: String) {
let newTodo = TodoItem(title: title, isCompleted: false, createdAt: Date())
todos.append(newTodo)
saveTodos()
}
func toggleTodo(_ todo: TodoItem) {
if let index = todos.firstIndex(where: { $0.id == todo.id }) {
todos[index].isCompleted.toggle()
saveTodos()
}
}
private func saveTodos() {
if let encoded = try? JSONEncoder().encode(todos) {
UserDefaults.standard.set(encoded, forKey: userDefaultsKey)
}
}
private func loadTodos() {
if let data = UserDefaults.standard.data(forKey: userDefaultsKey),
let decoded = try? JSONDecoder().decode([TodoItem].self, from: data) {
todos = decoded
}
}
}
在主视图中使用:
struct ContentView: View {
@StateObject private var todoStore = TodoStore()
var body: some View {
NavigationView {
List {
ForEach(todoStore.todos) { todo in
HStack {
Text(todo.title)
.strikethrough(todo.isCompleted)
Spacer()
Button("完成") {
todoStore.toggleTodo(todo)
}
}
}
}
.navigationTitle("待办事项")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink(destination: AddTodoView(store: todoStore)) {
Image(systemName: "plus")
}
}
}
}
}
}
复现步骤
- 创建新的SwiftUI项目
- 添加上述代码到项目中
- 运行应用,添加几条待办事项
- 关闭应用后重新打开,验证数据是否持久化
这种实现方式简单可靠,适合中小型应用的状态管理需求。

讨论