You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:54:23