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

时间:2019-06-18 12:05:04

标签: ios swift userdefaults

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

下面是我删除整个数组的方式

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

注意,saveProperty是一个可编码对象

3 个答案:

答案 0 :(得分:2)

您需要重新整理数组(如果存在),然后删除该项,最后保存回

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: { $0 == item})
        guard let res =  try? JSONEncoder().encode(arr) else { return }
        storage.set(res, forKey: key) 
    }
}

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

答案 1 :(得分:1)

您需要

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

示例1 :基于elementarray中删除index

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 :从element中删除特定的array

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

答案 2 :(得分:0)

UserDefaults不提供任何用于管理特定键内容的API。实际上,它并不关心将哪种内容保存在那里。

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