Редактировать структуру в UserDefaults без потери данных Swift - PullRequest
1 голос
/ 27 мая 2020

У меня есть приложение со структурой (назовем его Notes). У меня также есть множество заметок. Я сохранил этот массив в UserDefaults, используя codable, decode и encode. Получить код:

if let data = UserDefaults.standard.value(forKey:"NotesArray") as? Data {
        let decodedSports = try? PropertyListDecoder().decode([Notes].self, from: data)
        NotesArray = decodedSports ?? []
}

и установленный код:

UserDefaults.standard.set(try? PropertyListEncoder().encode(NotesArray), forKey:"NotesArray")

Мое приложение уже запущено. Теперь предположим, что в этой структуре есть переменные createdDate и modifiedDate. И теперь, через некоторое время, я хочу добавить новую переменную под названием «editable».

Как я могу сделать это, не теряя существующие данные в массиве? Я много искал и не нашел способа решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

У вас есть в основном два варианта:

Либо добавить новые свойства как Optionals, и работать с возможными значениями nil везде, где вы их используете.

Или локализовать работу с nil один раз в декодере .

Допустим, у вас есть

struct Notes: Codable {
   let text: String
}

. Добавление, например, createdDate можно сделать так:

struct Notes: Codable {
  let text: String
  let createdDate: Date

  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.text = try container.decode(String.self, forKey: .text)
    let createdDate = try container.decodeIfPresent(Date.self, forKey: .createdDate)
    self.createdDate = createdDate ?? Date(timeIntervalSince1970: 0) // or whatever default date you want to use
}
1 голос
/ 27 мая 2020

Я думаю, вы можете просто добавить поле в структуру как необязательное.

struct Notes: Codable{
    var date: Date
    var modifiedDate: Date
    var editable: Bool?
}

Затем вы можете установить редактируемое поле, как вам нужно, но это не должно иметь значения, если другие элементы в в массиве нет поля, так как это необязательно.

NotesArray[0].editable = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...