Обычно вы не можете сериализовать объекты в UserDefaults
.
Однако, поскольку вы работаете с JSON, вы можете использовать тип Codable для перевода объекта в / из JSONдля хранения.
[*] Одно предостережение в том, что Any
не кодируется.Самый простой способ сделать кодируемый тип - это объявить его свойства, используя типы, которые уже являются Кодируемыми.Эти типы включают стандартные типы библиотек, такие как String
, Int
и Double
;и типы основания, такие как Date
, Data
и URL
.Любой тип, свойства которого являются кодируемыми, автоматически соответствует Codable, просто объявив это соответствие.
Вот упрощенный пример:
//: Playground - noun: a place where people can play
import UIKit
class SafeJson: Codable {
var strValues:[String:String] = [:]
var intValues:[String:Int] = [:]
func setValue(_ value: String?, forKey key: String) {
strValues[key] = value
}
func setValue(_ value: Int?, forKey key: String) {
intValues[key] = value
}
}
let encoder = JSONEncoder()
let decoder = JSONDecoder()
let sampleObject = SafeJson()
sampleObject.setValue(12, forKey: "intValue1")
sampleObject.setValue(12345, forKey: "intValue2")
sampleObject.setValue("Banana", forKey: "yellowFruit1")
sampleObject.setValue("Orange", forKey: "orangeFruit1")
let encoded = try encoder.encode(sampleObject)
let key = "encodedObj"
UserDefaults.standard.setValue(encoded, forKey: key)
if let readValue = UserDefaults.standard.value(forKey: key) as? Data {
let decodedObj = try decoder.decode(SafeJson.self, from: readValue)
print("Decoded to \(decodedObj)")
}