我将一组结构体保存到 userDefaults,但是当我有两个具有相同 id 的项目时,我应该删除旧的并设置新的,这样做的最佳方法是什么? 我的想法是获取具有相同 id 的项目并删除它,然后设置新的,因为 id 相同但日期不同,或者另一种方式可以获得具有相同 id 的元素并更新日期
struct ListQR: Codable {
var resultQR:String?,
name:String?,
amout:String?,
id:String?,
date:String?
}
private var listaQR:[ListQR] = []
override func viewDidLoad() {
super.viewDidLoad()
updateData()
}
func updateData(){
let a = ListQR(resultQR: "1234567",
name: "YISUS",
amount: "9.99",
id: "00000001",
date: "09-05-2021")
var s:[ListQR] = []
let f = load()
s = f
s.append(a)
save(s)
}
func save(_ qr: [ListQR]){
let data = qr.map{
try? JSONEncoder().encode($0)
}
defaults.setValue(data, forKey:"isPosponerQR" )
}
func load() -> [ListQR] {
guard let encodedData = UserDefaults.standard.array(forKey: "isPosponerQR") as? [Data] else {
return []
}
return encodedData.map { try! JSONDecoder().decode(ListQR, from: $0) }
}
// In this function I evaluate if the I have two items with the same id
func checkRepeat(){
let id = "00000001"
for x in load(){
if id == x.id{
var j:[ListQR] = []
var f = load()
j = f
// In this line I want to delete the item with the same id
// I got this : Referencing operator function '==' on 'StringProtocol' requires that 'ListQR' conform to 'StringProtocol'
j.removeAll(where: {$0 == id})
}
}
例如: 我将此项目存储在 UserDefaults 中
ListQR(resultQR: "1234567",
name: "YISUS",
amount: "9.99",
id: "00000001",
date: "09-05-2021")
我想保存这个但有相同的id和不同的日期,所以我想删除我在UserDefaults中保存的项目或更新日期
ListQR(resultQR: "1234567",
name: "YISUS",
amount: "9.99",
id: "00000001",
date: "10-01-2021")
答案 0 :(得分:1)
很可能您的 load
方法不起作用,因为您保存的是 Data
,而不是[Data]
。
func load() -> [ListQR] {
guard let encodedData = UserDefaults.standard.data(forKey: "isPosponerQR") else { return [] }
return try? JSONDecoder().decode([ListQR].self, from: encodedData) ?? []
}
要更新数据查找新的id
的索引,如果有就替换它,如果没有则追加记录。
func updateData(){
let newListQR = ListQR(resultQR: "1234567",
name: "YISUS",
amount: "9.99",
id: "00000001",
date: "09-05-2021")
var currentData = load()
if let index = currentData.firstIndex(where: {$0.id == "00000001"}) {
currentData[index] = newListQR
} else {
currentData.append(newListQR)
}
save(currentData)
}
并且不要使用 value(forKey
,除非您意思是 KVC(您不使用)
defaults.set(data, forKey:"isPosponerQR" )
注意:似乎所有结构体成员都有值,如果是这样,将所有内容都声明为可选是没有意义的。