检测存储在 UserDefaults 中的数组中的项目

Deteting item in an array stored in UserDefaults

我在 UserDefaults 中保存项目并且它工作正常。我只是将新元素附加到数组中。现在删除了整个保存的项目,但现在我想让用户能够只删除一个项目,而不是删除整个保存的项目。

下面是我如何删除整个数组

public func deleteSavePropery() {
        delete(key: propertyKey)
    }
    private func delete(key: String) {
        storage.removeObject(forKey: key)
    }

注意,saveProperty 是一个 Codable 对象

UserDefaults 不提供任何 API 来管理特定密钥的内容。其实它并不关心那里保存了什么样的内容。

因此,您需要做的是:从 UserDefaults 中提取数组,对其进行编辑,然后将更新后的数组保存到 UserDefaults

你需要,

  1. UserDefaults 中获取 array
  2. 根据您的情况从 array 中删除 element
  3. array 保存回 UserDefaults

示例 1: 根据 index.

array 中删除 element
func remove(at index: Int) {
    if let data = storage.data(forKey: "YOUR_KEY") {
        do {
            var arr = try JSONDecoder().decode([Item].self, from: data)
            arr.remove(at: index)
            let data = try JSONEncoder().encode(arr)
            storage.set(data, forKey: "YOUR_KEY")
        } catch {
            print(error)
        }
    }
}

示例 2:array.

中删除特定的 element
func remove(element: Item) {
    if let data = storage.data(forKey: "YOUR_KEY") {
        do {
            var arr = try JSONDecoder().decode([Item].self, from: data)
            arr.removeAll { [=11=] === element }
            let data = try JSONEncoder().encode(arr)
            storage.set(data, forKey: "YOUR_KEY")
        } catch {
            print(error)
        }
    }
}

您需要检索数组(如果存在)然后删除该项目最后保存回来

let storage = UserDefaults.standard

private func deleteItem(key: String,item:Item) {
    if let data =  storage.data(forKey: key) , var arr =  try? JSONDecoder().decode([Item].self, from: data) {
        arr.removeAll(where: { [=10=] == item})
        guard let res =  try? JSONEncoder().encode(arr) else { return }
        storage.set(res, forKey: key) 
    }
}

struct Item:Codable,Equatable { 
    let name:String 
}