Sobes.tech
Junior

Comment sauvegarder et lire une structure de données en utilisant User Defaults?

sobes.tech IA

Réponse de l'IA

User Defaults ne stocke qu'un ensemble limité de types : Data, String, Number, Date, Array, Dictionary. Pour stocker des structures de données personnalisées, il est nécessaire de les encoder en Data et de les décoder à nouveau.

Le protocole utilisé est Codable (une combinaison de Encodable et Decodable).

  1. Définition de la structure : La structure doit respecter le protocole Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Sauvegarde : Encoder la structure en Data avec JSONEncoder et la sauvegarder dans User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Encoder en Data
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Sauvegarder Data avec la clé
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Gestion d'erreur d'encodage
        print("Échec de l'encodage de la structure")
    }
    
  3. Lecture : Lire Data depuis User Defaults et le décoder en structure avec JSONDecoder.

    // Récupérer Data par clé
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Décoder Data en structure
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Utiliser la structure chargée
            print("Structure chargée : \(loadedStruct)")
        } else {
            // Gestion d'erreur de décodage
            print("Échec du décodage des données")
        }
    } else {
        // Pas de données trouvées pour la clé
        print("Aucune donnée trouvée pour la clé")
    }
    

Points clés :

  • User Defaults n'est pas destiné à stocker de grandes quantités de données ou des informations sensibles.
  • L'utilisation de Codable et JSONEncoder/JSONDecoder est la méthode standard pour sauvegarder des types personnalisés en Data.
  • Il faut utiliser try? et gérer les erreurs potentielles d'encodage/décodage.
  • Pour sauvegarder des tableaux de structures, on utilise également Codable.
// Exemple de sauvegarde d'un tableau de structures
let dataArray: [MyData] = [
    MyData(id: 1, name: "A", isActive: true),
    MyData(id: 2, name: "B", isActive: false)
]

let encoder = JSONEncoder()
if let encodedArrayData = try? encoder.encode(dataArray) {
    UserDefaults.standard.set(encodedArrayData, forKey: "myCustomArray")
}

// Exemple de lecture d'un tableau de structures
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Tableau chargé : \(loadedArray)")
    }
}