Sobes.tech
Junior

Come salvare e leggere una struttura dati utilizzando User Defaults?

sobes.tech AI

Risposta dell'AI

User Defaults memorizza solo un insieme limitato di tipi: Data, String, Number, Date, Array, Dictionary. Per memorizzare strutture dati personalizzate, è necessario codificarle in Data e decodificarle di nuovo.

Il protocollo utilizzato è Codable (una combinazione di Encodable e Decodable).

  1. Definizione della struttura: La struttura deve rispettare il protocollo Codable.

    struct MyData: Codable {
        let id: Int
        let name: String
        let isActive: Bool
    }
    
  2. Salvataggio: Codificare la struttura in Data usando JSONEncoder e salvarla in User Defaults.

    let myStruct = MyData(id: 1, name: "Example", isActive: true)
    
    // Codifica in Data
    let encoder = JSONEncoder()
    if let encodedData = try? encoder.encode(myStruct) {
        // Salva i Data con la chiave
        UserDefaults.standard.set(encodedData, forKey: "myCustomData")
    } else {
        // Gestione errore di codifica
        print("Fallito l'encoding della struct")
    }
    
  3. Lettura: Leggere Data da User Defaults e decodificare di nuovo nella struttura usando JSONDecoder.

    // Ottieni Data per chiave
    if let savedData = UserDefaults.standard.data(forKey: "myCustomData") {
        // Decodifica Data nella struttura
        let decoder = JSONDecoder()
        if let loadedStruct = try? decoder.decode(MyData.self, from: savedData) {
            // Usa la struttura caricata
            print("Struct caricata: \(loadedStruct)")
        } else {
            // Gestione errore di decodifica
            print("Fallito il decoding dei dati")
        }
    } else {
        // Nessun dato trovato per la chiave
        print("Nessun dato trovato per la chiave")
    }
    

Punti chiave:

  • User Defaults non è destinato a memorizzare grandi quantità di dati o informazioni riservate.
  • L'uso di Codable e JSONEncoder/JSONDecoder è il metodo standard per salvare tipi personalizzati in Data.
  • È necessario usare try? e gestire eventuali errori di codifica/decodifica.
  • Per salvare array di strutture si utilizza anch'esso Codable.
// Esempio di salvataggio di un array di strutture
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")
}

// Esempio di caricamento di un array di strutture
if let savedArrayData = UserDefaults.standard.data(forKey: "myCustomArray") {
    let decoder = JSONDecoder()
    if let loadedArray = try? decoder.decode([MyData].self, from: savedArrayData) {
        print("Array caricato: \(loadedArray)")
    }
}