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).
-
Definizione della struttura: La struttura deve rispettare il protocollo
Codable.struct MyData: Codable { let id: Int let name: String let isActive: Bool } -
Salvataggio: Codificare la struttura in
DatausandoJSONEncodere 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") } -
Lettura: Leggere
Datada User Defaults e decodificare di nuovo nella struttura usandoJSONDecoder.// 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
CodableeJSONEncoder/JSONDecoderè il metodo standard per salvare tipi personalizzati inData. - È 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)")
}
}