Objective-C: come utilizzare al meglio i file property list

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:

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:

Open As Source Code

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

Array property List

da questo momento in poi la root del file XML sarà un array (l’elemento è identificato da Item 0 che è l’indice).

TypeA 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:

Array Dictionary

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
// Legge il file Property list (xml) e lo trasforma in un
// array (NSArray)
NSArray *arrayQuiz = [NSArray arrayWithContentsOfFile:[
  [NSBundle mainBundle] pathForResource:@"Quiz"
                                 ofType:@"plist"]];

Ora, dato che gli elementi dell’array sono dictionary, per estrarre – ad esempio – il titolo di tutte le domande, basta scrivere:

1
2
3
for (NSDictionary *item in arrayQuiz) {
  NSLog(@"%@", [item objectForKey:@"Description"]);
}

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.

Non ci sono commenti per questo Post

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL