从 UserDefaults 中删除项目

时间:2021-05-09 18:26:09

标签: ios swift xcode

我将一组结构体保存到 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")

1 个答案:

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

注意:似乎所有结构体成员都有值,如果是这样,将所有内容都声明为可选是没有意义的。