Swift中如何修改存储库并持久化保存数据?
解决Swift数据修改与持久化的简便方案
你的现有代码存在两个核心问题:一是Storage的所有属性都是let常量,无法修改;二是vareStorage是静态常量数组,不能动态更新,更没法实现持久化。下面给你一套适合新手的简单方案,用UserDefaults(适配小规模数据)+ ObservableObject(配合SwiftUI自动更新UI)来搞定。
步骤1:修改Storage结构体
把属性改成可变的,同时遵循Codable协议(这样才能将数据编码存储到UserDefaults):
struct Storage: Identifiable, Codable { let id = UUID() var category: Int // 改为var支持修改 var item: String // 改为var支持修改 var amount: Int // 改为var支持修改 }
步骤2:创建数据管理类
用ObservableObject封装数据的加载、修改和持久化逻辑,数据变化时能自动通知UI更新:
import SwiftUI class StorageManager: ObservableObject { // @Published修饰:数据变化时自动触发UI刷新 @Published var storageItems: [Storage] = [] // 存储到UserDefaults的标识键 private let storageKey = "VareStorage" init() { // 初始化时自动加载本地存储的数据 loadSavedData() } // 从本地加载数据 private func loadSavedData() { guard let data = UserDefaults.standard.data(forKey: storageKey), let savedItems = try? JSONDecoder().decode([Storage].self, from: data) else { // 无本地数据时,用默认数据初始化 storageItems = [ Storage(category: 0, item: "Kegs", amount: 25), Storage(category: 0, item: "Whine", amount: 20), Storage(category: 1, item: "Coke", amount: 15), Storage(category: 1, item: "Pepsi", amount: 10), Storage(category: 2, item: "Napkins", amount: 5), Storage(category: 2, item: "Glasses", amount: 0) ] return } storageItems = savedItems } // 将数据保存到本地 private func saveData() { if let encodedData = try? JSONEncoder().encode(storageItems) { UserDefaults.standard.set(encodedData, forKey: storageKey) } } // 修改指定item的数量示例方法 func updateAmount(for itemId: UUID, newAmount: Int) { if let index = storageItems.firstIndex(where: { $0.id == itemId }) { storageItems[index].amount = newAmount saveData() // 修改后立即持久化 } } // 添加新物品的示例方法 func addNewItem(category: Int, item: String, amount: Int) { let newItem = Storage(category: category, item: item, amount: amount) storageItems.append(newItem) saveData() } // 可按需扩展删除、修改分类等其他方法 }
步骤3:在SwiftUI视图中使用
通过@StateObject绑定数据管理类,直接操作数据并自动同步UI:
struct ContentView: View { // @StateObject确保实例生命周期与视图一致 @StateObject private var storageManager = StorageManager() var body: some View { List(storageManager.storageItems) { item in HStack { VStack(alignment: .leading) { Text(item.item) Text("分类: \(item.category)") } Spacer() Text("\(item.amount)") // 增减数量按钮示例 Button("-") { storageManager.updateAmount(for: item.id, newAmount: item.amount - 1) } Button("+") { storageManager.updateAmount(for: item.id, newAmount: item.amount + 1) } } } .toolbar { // 添加新物品按钮示例 Button("添加") { storageManager.addNewItem(category: 0, item: "新物品", amount: 10) } } } }
关键说明
UserDefaults适合存储小规模数据(比如你的物品列表),如果后续数据量增大或需要复杂查询,再考虑CoreData或Realm。- 每次修改数据后调用
saveData(),确保修改被持久化,下次打开APP会自动加载最新数据。
内容的提问来源于stack exchange,提问作者juletre
相关产品推荐
相关产品推荐

