Swiftui 将字典存储在UserDefaults中

Swiftui 将字典存储在UserDefaults中,swiftui,Swiftui,这是一种类似的方法,但是,它是为SwiftUI设计的,不使用像set这样的单行,所以我想用一个变量将值存储在某个地方,以便轻松调用它。它也不同,因为我要求初始化 我有以下资料: @Published var mealAndStatus: Dictionary init() { mealAndStatus = ["Breakfast": "initial", "Snack": "notSet", "

这是一种类似的方法,但是,它是为SwiftUI设计的,不使用像set这样的单行,所以我想用一个变量将值存储在某个地方,以便轻松调用它。它也不同,因为我要求初始化

我有以下资料:

@Published var mealAndStatus: Dictionary

init() {
    mealAndStatus = ["Breakfast": "initial", "Snack": "notSet", "Lunch": "notSet", "Snack2": "notSet", "Dinner": "notSet"]
    if let storedDay = UserDefaults.standard.value(forKey: "mealAndStatus") {
        mealAndStatus = storedDay as! Dictionary
    }
}
1-如何在SwiftUI的UserDefaults中正确存储该词典

2-那个init,我必须在ContentView的开头调用它吗?或者我可以像那样把它放在另一个swift文件上吗?不确定如何调用init

我已经做了一个与布尔工作:

@Published var startDay: Bool

init() {
    startDay = true
    if let storedDay = UserDefaults.standard.value(forKey: "startDay") {
        startDay = storedDay as! Bool
    }
}

但是这本字典似乎不起作用。我需要初始化该字典,并将其存储在UserDefaults中,以便以后可以访问它。非常感谢您的帮助。

使用JSONECODER和JSONDecoder可以帮助您将符合codable的任何结构或字典转换为数据

let arrayKey = "arrayKey"

func store(dictionary: [String: String], key: String) {
    var data: Data?
    let encoder = JSONEncoder()
    do {
        data = try encoder.encode(dictionary)
    } catch {
        print("failed to get data")
    }
    UserDefaults.standard.set(data, forKey: key)
}

func fetchDictionay(key: String) -> [String: String]? {
    let decoder = JSONDecoder()
    do {
        
        if let storedData = UserDefaults.standard.data(forKey: key) {
            let newArray = try decoder.decode([String: String].self, from: storedData)
            print("new array: \(newArray)")
            return newArray
        }
    } catch {
        print("couldn't decode array: \(error)")
    }
    return nil
}

// You would put this where you want to save the dictionary
let mealAndStatus = ["Breakfast": "initial", "Snack": "notSet", "Lunch": "notSet", "Snack2": "notSet", "Dinner": "notSet"]

store(dictionary: mealAndStatus, key: arrayKey)


// You would put this where you want to access the dictionary

let savedDictionary = fetchDictionay(key: arrayKey)

另一方面,您可能不应该使用标准默认值来存储这样的内容。将其存储为数据库,或将其保存在文件中,尤其是在数据库或文件上加密可能会更安全。

这是我为SwiftUI找到的完美解决方案:

将其存储在某个地方,在我的例子中,我仅为UserDefault创建了一个类:

@Published var mealAndStatus: [String: Date] =
    UserDefaults.standard.dictionary(forKey: "mealAndStatus") as? [String: Date] ?? [:] {
    didSet {
        UserDefaults.standard.set(self.mealAndStatus, forKey: "mealAndStatus")
    }
}
上面的操作将初始化字典,并创建一个易于调用和更新值的变量。这可以在午餐时间修改并添加新值,这样就可以用我想要的任何东西初始化


此外,现在在Apple Dev wwdc20上,他们宣布了一种使用SwiftUI处理用户默认值的新方法,这可能比上述方法更好。propery包装器被称为:
@AppStorage

@HalR让我看看是否可以让它工作,thanks@HalR不,我仍然在转换函数时遇到问题,我该怎么做?解决方案:那不是解决方案,我已经找到了,谢谢,不是吗?什么是?我感谢你给我展示了我不知道的编码器,我肯定会研究它,但我现在要做的就是在应用程序安装时用一些元素预定义一个简单的字典,并将其存储在默认值上。这就是init的原因