iOS | Свифт | Как сохранить пользовательские объекты в UserDefaults с помощью PropertyListEncoder/Decoder с…

Бывают случаи, когда нам нужно локально хранить только некоторые объекты и мы не хотим создавать базу данных 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»)

Источник: ledsshop.ru

Стиль жизни - Здоровье!