Свифт (v 5 / 5.1) новичок здесь, испытывает трудности с Codables ... в надежде получить совет от экспертов здесь.
Хорошо, у меня есть простой словарь из структуры, где ключэто строкаЯ хочу сохранить словарь в UserDefaults (и позже получить). Здесь есть несколько похожих вопросов, но в основном они касаются вложенных структур.
Первая попытка (обработка ошибок удалена для простоты):
public struct PriceStruct:Codable {
var myPrice: Double
var myTime: TimeInterval
var selected: Bool
var direction: Int
var myHigh, myLow: Double
enum CodingKeys: String, CodingKey {
case myPrice = "myPrice"
case myTime = "myTime"
case selected = "selected"
case direction = "direction"
case myHigh = "myHigh"
case myLow = "myLow"
}
}
var myPrices: [String: PriceStruct] = [:]
// [fill myPrices with some data...]
func savePrices() {
// error: Attempt to set a non-property-list object
UserDefaults.standard.set(myPrices, forKey: "prices")
}
func loadPrices() {
// obviously this doesn't work either
let myPrices = UserDefaults.standard.data(forKey: "prices")
}
While I assumed from the documentation, that UserDefaults is capable of storing dictionaries, it doesn't - at least for me.
Next thing I tried was using JSONEncoder like this:
// this time with prior JSON encoding
func savePrices() {
// this works
let json = try! JSONEncoder().encode(myPrices)
UserDefaults.standard.set(json as Data, forKey: "prices")
}
func loadPrices() {
// this doesn't work
let json = UserDefaults.standard.data(forKey: "prices")
let decoder = JSONDecoder()
let decoded = try! decoder.decode(PriceStruct.self, from json!)
}
К сожалению, я получаюошибка при попытке загрузить данные обратно из UserDefaults: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "myPrice", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"myPrice\", intValue: nil) (\"myPrice\").", underlyingError: nil))
Другие варианты, которые я пробовал, - преобразование закодированного JSON в строку в кодировке UTF8 и сохранение / получение этой строки:
func savePrices() {
// this works too
let json = try! JSONEncoder().encode(myPrices)
UserDefaults.standard.set(String(data: json, encoding: .utf8), forKey: "prices")
}
func loadPrices() {
// and this doesn't work either
let json = UserDefaults.standard.string(forKey: "prices")!.data(using: .utf8)
}
ИтакСудя по поднятой ошибке, CodingKeys является корнем проблемы. Я попытался переключиться с помощью NSKeyedArchiver и NSKeyedUnarchiver`, но безуспешно.
Мне действительно интересно, есть ли простое / универсальное решение для сохранения / загрузки словаря в UserDefaults?
Все вашикомментарии и предложения приветствуются. Спасибо!