Salvare i dati su iOS con Swift e NSUserDefaults

iOS offre una soluzione molto semplice per la persistenza dei dati primitivi o di oggetti conformi al protocollo NSCoding: NSUserDefaults.

Ecco alcuni esempi di dati che dovreste salvare con NSUserDefaults:

  1. Il punteggio raggiunto in un videogioco.
  2. L’elenco dei livello completati in un videogioco.
  3. Le preferenze dell’utente relative ai filtri per un app che ricerca appartamenti.
  4. Gli articoli che l’utente ha aggiunto in un app per la lista della spesa.

Tipi di dato

NSUserDefaults supporta il salvataggio di

  1. Bool
  2. Double
  3. Float
  4. Integer
  5. URL
  6. AnyObject?

Scrittura

Vediamo intanto come salvare un valore di tipo Bool.

La prima riga dichiara una costante Bool contente il valore true. La seconda riga chiede ad iOS di salvare su memoria persistente la costante. Per motivi di performance il sistema operativo tiene una versione cache dei dati di NSUserDefaults in RAM quindi se avete particolare urgenza che i dati vengano scritti sulla memoria persistente dovreste aggiungere questa riga e controllare che il valore restituito sia true (solo in queste caso avete la garanzia che il valore è stato già spostato sulla memoria persistente).

Lettura

Per leggere un valore che avete precedentemente salvato su NSUserDefaults basta scrivere:

Tutto qui.

Valori nulli

Se state provando questo codice su Xcode Playground e fate alt + click sul metodo boolForKey accedete alla documentazione del metodo.

Stiamo usando Swift quindi quel Bool come valore di ritorno significa che il metodo restituirà sempre un valore true o false, non è ammesso nil. Quindi nel caso cercassimo di recuperare un valore non salvato in precedenza otterremo false.

Gestione di URL

L’approccio visto fino ad ora funziona con i tipi primitivi di Swift: Bool, Double, Float, Integer. Inoltre sono forniti 2 metodi appositi per la gestione degli URL, rispettivamente:

Notate che la firma di URLForKey restituisce un optional (NSURL?) quindi in tal caso se richiedete un URL con una chiave non valida ottonerete nil.

Gestione di qualsiasi oggetto

Infine vediamo come salvare un oggetto di una nostra classe.

Definiamo una semplice classe Game.

Notate che la classe è conforme al protocollo Printable, questo non è legato all’utilizzo di NSUserDefaults, semplicemente permette di stampare facilmente la classe. Infatti quando il sistema operativo deve stampare una classe di tipo Printable legge la sua computed variable description.

Ora creiamo un oggetto di tipo Game.

Proviamo ora a salvare la classe sulla memoria persistente con NSUserDefaults.

Il problema è che non possiamo passare a setObject un qualsiasi oggetto… dobbiamo prima codificarlo. Ma per farlo dobbiamo renderlo conforme al protocollo NSCoding e quindi implementare un metodo e un initializer:

Ora possiamo trasformare l’istanza lumineticLand in un oggetto di tipo NSData da salvare su NSUserDefaults.

E poi rileggerla.

 

Luca Angeletti

Trainer • Developer • Writer

One thought to “Salvare i dati su iOS con Swift e NSUserDefaults”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *