J'enregistre des éléments dans UserDefaults et cela fonctionne très bien. J'ajoute simplement de nouveaux éléments au tableau. maintenant, la suppression de tous les éléments enregistrés est terminée, mais je veux maintenant permettre à l'utilisateur de supprimer un seul élément au lieu de supprimer tous les éléments enregistrés.

Voici comment je supprime tout le tableau entier

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

REMARQUE, saveProperty est un objet codable

0
King 18 juin 2019 à 15:05

3 réponses

Meilleure réponse

Vous devez récupérer le tableau s'il existe, puis supprimer l'élément et enfin le sauvegarder

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 
}
2
marc_s 26 juil. 2019 à 12:15

Tu dois,

  1. Récupérez le array de UserDefaults.
  2. Supprimez le element du array en fonction de votre état.
  3. Enregistrez le array dans UserDefaults.

Exemple 1: suppression de element de array en fonction de 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)
        }
    }
}

Exemple 2: suppression d'un element particulier de 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)
        }
    }
}
1
PGDev 18 juin 2019 à 12:23

UserDefaults ne fournit aucune API pour gérer le contenu d'une clé particulière. En fait, peu importe le type de contenu qui y est enregistré.

Donc, ce que vous devez faire est de: extraire le tableau de UserDefaults, le modifier puis enregistrer un tableau mis à jour dans UserDefaults.

0
FreeNickname 18 juin 2019 à 12:08