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).
-
Définition de la structure : La structure doit respecter le protocole
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Sauvegarde : Encoder la structure en
DataavecJSONEncoderet 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") } -
Lecture : Lire
Datadepuis User Defaults et le décoder en structure avecJSONDecoder.// 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
CodableetJSONEncoder/JSONDecoderest la méthode standard pour sauvegarder des types personnalisés enData. - 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)")
}
}