Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在UserDefaults中编辑结构而不丢失数据_Ios_Swift - Fatal编程技术网

Ios 在UserDefaults中编辑结构而不丢失数据

Ios 在UserDefaults中编辑结构而不丢失数据,ios,swift,Ios,Swift,我有一个应用程序,有一个结构(让我们称之为笔记)。我还有一系列的笔记。我使用codable和decode-and-encode将这个数组存储在UserDefaults中。 检索代码: if let data = UserDefaults.standard.value(forKey:"NotesArray") as? Data { let decodedSports = try? PropertyListDecoder().decode([Notes].self, from: da

我有一个应用程序,有一个结构(让我们称之为笔记)。我还有一系列的笔记。我使用codable和decode-and-encode将这个数组存储在UserDefaults中。 检索代码:

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”的新变量


如何在不丢失阵列中现有数据的情况下执行此操作?我搜索了很多,找不到任何方法来解决这个问题。

我认为您可以将该字段作为可选字段添加到结构中

struct Notes: Codable{
    var date: Date
    var modifiedDate: Date
    var editable: Bool?
}
然后,您可以根据需要将该字段设置为可编辑,但如果数组中的其他项没有该字段,则无所谓,因为它是可选的

NotesArray[0].editable = true

我认为您可以将该字段作为可选字段添加到结构中

struct Notes: Codable{
    var date: Date
    var modifiedDate: Date
    var editable: Bool?
}
然后,您可以根据需要将该字段设置为可编辑,但如果数组中的其他项没有该字段,则无所谓,因为它是可选的

NotesArray[0].editable = true

您基本上有两种选择:

或者将新属性添加为可选项,并在使用它们的任何地方处理可能的nil值

或者,在解码器中本地化处理一次nils

假设你有

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
}

您基本上有两种选择:

或者将新属性添加为可选项,并在使用它们的任何地方处理可能的nil值

或者,在解码器中本地化处理一次nils

假设你有

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
}