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")

См. также:  Указатели и ссылки в C ++
Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: