将字典存储在UserDefaults中

时间:2020-04-26 02:49:14

标签: swiftui

这与Save dictionary to UserDefaults类似,但是,它用于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的开头调用它?还是可以像这样将其保留在另一个快速文件上?不确定如何调用init。

我已经用bool制作了一个:

@Published var startDay: Bool

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

,但是字典似乎不起作用。我需要初始化该字典,并将其存储在UserDefaults中,以便以后使用。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

使用JSONEncoder和JSONDecoder将帮助您将符合可编码的任何结构或字典转换为数据。

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)

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

答案 1 :(得分:0)

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

将其存储在某个地方,在我的情况下,我仅为UserDefaults创建了一个类:

@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处理UserDefaults的新方法,该方法可能比上述方法更好。属性包装器称为:@AppStorage

相关问题