【问题标题】:Deteting item in an array stored in UserDefaults检测存储在 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 对象

【问题讨论】:

    标签: ios swift userdefaults


    【解决方案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】:

    你需要,

    1. UserDefaults获取array
    2. 根据您的情况从array 中删除element
    3. 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 对象。我必须先解码还是什么?
    • 是的。就像你在这里做的一样 - stackoverflow.com/questions/56636494/…
    • 我不明白,是否需要先解码才能删除我的编码才能设置
    • 更新答案。
    • Binary operator '===' cannot be applied to operands of type '_' and 'Item.Type'
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2021-01-01
      相关资源
      最近更新 更多