我将项目保存在UserDefaults中,并且工作正常。我只是将新元素添加到数组。现在已经删除了所有保存的项目,但是现在我想使用户能够删除一个项目,而不是删除整个保存的项目。
下面是我删除整个数组的方式
public func deleteSavePropery() {
delete(key: propertyKey)
}
private func delete(key: String) {
storage.removeObject(forKey: key)
}
注意,saveProperty是一个可编码对象
答案 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)
您需要
array
获取UserDefaults
。element
中删除array
。array
保存回UserDefaults
。 示例1 :基于element
从array
中删除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
。