Uno dei vantaggi dei file Property list, che altro non sono che file testuali che seguono lo standard XML, è quello di poter essere trasformati istantaneamente in oggetti (come array o dictionary) Objective-C. Quando si crea un file Property list:

per impostazione predefinita, Xcode 4 genera il seguente codice:
1 2 3 4 5 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict/> </plist> |
Nell’IDE di Xcode questo viene visualizzato come un dictionary ed è possibile solo aggiungerci elementi ma non modificarne il tipo. Spesso, invece, è più comodo partire da un array, cioè creare un array di dictionary invece che un dictionary di dictionary; questo per due motivi principali:
- Gli array sono ordinati
- L’accesso all’array non necessita di chiave
Per trasformare il dictionary principale basta selezionare il file Property list nel Project navigator e – dal menu contestuale – scegliere Open As > Source Code:

A questo punta basta sostituire il tag <dict/> con <array/>, salvare e tornare alla visualizzazione Property list;

da questo momento in poi la root del file XML sarà un array (l’elemento è identificato da Item 0 che è l’indice).
A questo punto possiamo popolare il nostro array con gli elementi che preferiamo. Personalmente mi capita spesso di usare i dictionary, cioè lavorare con array di dictionary, essendo questi comodi per estrarre in modo asincrono, quindi tramite chiavi, i dati in essi contenuti. Ad esempio immaginiamo di dover gestire un Quiz a domande, con 4 risposte per ogni domanda e dove solo una di queste risposte è corretta.
L’ideale sarebbe appunto quelle di avere un array di “domande” (cioè dictionary), ordinate, e che ogni domanda contenesse: descrizione, 4 risposte e il numero di quella corretta, ovvero una situazione del tipo:

Che in codice è:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <dict> <key>Description</key> <string>Domanda 1</string> <key>ResponseTopLeft</key> <string>Risposta 1</string> <key>ResponseTopRight</key> <string>Risposta 2</string> <key>ResponseBottomLeft</key> <string>Risposta 3</string> <key>ResponseBottomRight</key> <string>Risposta 4</string> <key>Response</key> <integer>2</integer> </dict> <dict> <key>Description</key> <string>Domanda 2</string> <key>ResponseTopLeft</key> <string>Risposta 1</string> <key>ResponseTopRight</key> <string>Risposta 2</string> <key>ResponseBottomLeft</key> <string>Risposta 3</string> <key>ResponseBottomRight</key> <string>Risposta 4</string> <key>Response</key> <integer>2</integer> </dict> </array> </plist> |
La comodità, in tutto questo, risiede nella semplicità con cui è possibile leggere il file e i suoi dati. Se il nostro file nelle risorse dell’applicazione si chiama Quiz.plist:
1 2 3 4 5 |
Ora, dato che gli elementi dell’array sono dictionary, per estrarre – ad esempio – il titolo di tutte le domande, basta scrivere:
1 2 3 |
Ovviamente la prima domanda (array ordinato…) sarà in NSDictionary *question = [arrayQuiz objectAtIndex:0];, e così via. Ciclare tra le domande o ottenere un puntamento diretto diventa davvero semplice e chiaro.
All’interno del ciclo for, ad esempio, è possibile poi instanziare oggetti e popolarne le proprietà con i parametri del dictionary.








7
Non ci sono commenti per questo Post
Lascia un commento