Бывают случаи, когда нам нужно локально хранить только некоторые объекты и мы не хотим создавать базу данных sqlite/CoreData. Например, предположим, что мы разрабатываем приложение, и все данные извлекаются с сервера, и мы не сохраняем никаких данных, но нам нужно поддерживать пользовательский сеанс и, следовательно, хранить пользовательский объект, и мы просто хотим сохранить его в UserDefaults.
Итак, у нас есть структура User, реализующая протокол Codable. Codable подразумевает, что он реализует как протоколы Decodable, так и Encodable.
struct User: Codable { var id: String var firstName: String var lastName: String var email: String }
Как следует из названий, реализуя Encodable и Decodable, вы даете своему классу возможность кодирования и декодирования во внешнее представление и из него, например JSON или список свойств.
И кто занимается этим кодированием или декодированием? Это будет кодировщик или декодер такого рода. например, JSONDecoder или PropertyListDecoder.
Создадим расширение класса UserDefaults:
я. Метод setCustomObject принимает общий параметр, который должен подтверждать протокол Encodable. Он создает экземпляр PropertyListEncoder, который кодирует объект и возвращает закодированные данные. А затем мы сохраняем эти данные в UserDefaults.
II. Метод customObject: forKey сначала получает значение сохраненных закодированных данных, вызывая data(forKey:key) для UserDefaults. Помните, эти данные были закодированы с помощью Encoder? Итак, теперь нам нужно будет декодировать эти данные с помощью PropertyListDecoder.
Пример использования:
class SomeClass { func exampleSave() { let user = User(id: "123", firstName: "Alpha", lastName: "Beta", email: "[email protected]") try? UserDefaults.standard.setCustomObject(user, forKey: "YOUR_KEY") } func exampleGet() { let user: User? = try? UserDefaults.standard.customObject(forKey: "YOUR_KEY") } }
Здесь следует отметить одну вещь.
let user: User? = UserDefaults.standard.customObject(type: User.self, forKey: “YOUR_KEY”) user.firstName = "New name" //This alone will not update data //You will have to re-save the whole object after modification UserDefaults.standard.setCustomObject(user, forKey: "YOUR_KEY")