检测存储在 UserDefaults 中的数组中的项目
Posted
技术标签:
【中文标题】检测存储在 UserDefaults 中的数组中的项目【英文标题】:Deteting item in an array stored in UserDefaults 【发布时间】:2019-06-18 12:05:04 【问题描述】:我在 UserDefaults 中保存项目,它工作正常。我只是将新元素附加到数组中。现在删除整个保存的项目已经完成,但现在我想让用户能够只删除一个项目而不是删除整个保存的项目。
下面是我如何删除整个数组
public func deleteSavePropery()
delete(key: propertyKey)
private func delete(key: String)
storage.removeObject(forKey: key)
注意,saveProperty 是一个 Codable 对象
【问题讨论】:
【参考方案1】:如果存在则需要检索数组然后删除该项目最后保存回来
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
【讨论】:
我正在保存一个 Codable 对象。我必须先解码还是什么?Cannot convert value of type '(_OptionalNilComparisonType) -> Bool' to expected argument type 'Bool'
最初的错误是Extra argument 'where' in call
,所以我删除了where
,留下了 $0 == item
上面和我一起编译,目前有什么问题?
我是否必须对要执行此操作的所有对象执行此操作? class Item:Codable,Equatable static func == (lhs: Item, rhs: Item) -> Bool return lhs.name == rhs.name let name:String! // add init
【参考方案2】:
你需要,
-
从
UserDefaults
获取array
。
根据您的情况从array
中删除element
。
将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 $0 === element
let data = try JSONEncoder().encode(arr)
storage.set(data, forKey: "YOUR_KEY")
catch
print(error)
【讨论】:
我正在保存一个 Codable 对象。我必须先解码还是什么? 是的。就像你在这里做的一样 - ***.com/questions/56636494/… 我不明白,是否需要先解码才能删除我的编码才能设置 更新答案。Binary operator '===' cannot be applied to operands of type '_' and 'Item.Type'
【参考方案3】:
UserDefaults
不提供任何 API 来管理特定密钥的内容。实际上,它并不关心那里保存了什么样的内容。
因此,您需要做的是:从UserDefaults
中提取数组,对其进行编辑,然后将更新后的数组保存到UserDefaults
。
【讨论】:
以上是关于检测存储在 UserDefaults 中的数组中的项目的主要内容,如果未能解决你的问题,请参考以下文章
确定可以存储在 UserDefaults 中的 Swift 类型
您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?
只有 NSDictionary 中的属性列表对象(NSNumber),但不能在 UserDefaults 中存储 dict