Обнаружение элемента в массиве, хранящемся в UserDefaults - PullRequest
0 голосов
/ 18 июня 2019

Я сохраняю элементы в UserDefaults, и все работает нормально. Я просто добавляю новые элементы в массив. удаление всех сохраненных элементов завершено, но теперь я хочу разрешить пользователю удалять только один элемент вместо удаления всех сохраненных элементов.

ниже, как я удаляю весь массив

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

ПРИМЕЧАНИЕ. SaveProperty - это кодируемый объект

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Вам нужно восстановить массив, если он существует, затем удалить элемент, затем сохранить обратно

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 голос
/ 18 июня 2019

Вам необходимо,

  1. Извлечь array из UserDefaults.
  2. Удалить element из array в зависимости от вашего состояния.
  3. Сохранить 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)
        }
    }
}
0 голосов
/ 18 июня 2019

UserDefaults не предоставляет API для управления содержимым определенного ключа.На самом деле, все равно, какой тип контента там сохраняется.

Итак, вам нужно сделать следующее: извлечь массив из UserDefaults, отредактировать его, а затем сохранить обновленный массив в UserDefaults.

...