检测存储在 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:基于 indexarray 中删除 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 类型

在 UserDefaults 中存储自定义对象数组

您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?

只有 NSDictionary 中的属性列表对象(NSNumber),但不能在 UserDefaults 中存储 dict

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

存储/保存 @State 数组 (UserDefaults)