Ios 在UserDefaults中编辑结构而不丢失数据
我有一个应用程序,有一个结构(让我们称之为笔记)。我还有一系列的笔记。我使用codable和decode-and-encode将这个数组存储在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
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
}