2010-04-22 19 views

risposta

58

Non esiste un "primo" elemento in un NSDictionary; i suoi membri non hanno un ordine garantito. Se si desidera solo un oggetto da un dizionario, ma non si cura quale tasto è associata con, si può fare:

id val = nil; 
NSArray *values = [yourDict allValues]; 

if ([values count] != 0) 
    val = [values objectAtIndex:0]; 
+0

id val = nil; ?? – lajarre

+1

Sì, quindi puoi ancora messaggio 'val' senza crash se' [valori count] 'è zero. – Wevah

+3

Si noti che il metodo '' 'allValues''' restituisce un array non ordinato. Per la documentazione "L'ordine dei valori nell'array non è definito.". Quindi potresti non ottenere l'oggetto che ti aspetti di ottenere. –

25

NSDictionaries non sono ordinati, il che significa che non ci sono primo o l'ultimo elemento. In effetti, l'ordine delle chiavi non è mai garantito per essere lo stesso, anche nella vita di un dizionario specifico.

Se si desidera un oggetto, è possibile ottenere uno dei tasti:

id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty 
id object = [message objectForKey:key]; 
+0

Grazie - ha senso. – Ronaldoh1

0

Se hai NSDictionary nome messaggio, è abbastanza semplice:

message[[[message allKeys] objectAtIndex:0]]; 

Ma voi devi essere sicuro (o meglio controllare) che il tuo dizionario abbia almeno un elemento. Ecco come si può controllare:

if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]); 

Ma NSDictionary non ha alcun ordine garantito, quindi probabilmente dovrebbe utilizzare questo codice solo se il dizionario ha un solo elemento.

[UPDATE] E 'anche una buona idea quella di utilizzare questo se è necessario per ottenere qualsiasi elemento di dizionario

-2

Prova questo:

NSDictionary *firstValue = [responseObject objectAtIndex:0]; 
1

Secondo Apple, chiama a allKeys o allValues sostenere il costo di creare nuovi array:

Un nuovo array contenente i valori del dizionario o un array vuoto se dizionario non ha inserzioni (sola lettura)

Quindi, un'opzione alternativa che non incorrere tale costo potrebbe essere la seguente:

NSString* key = nil; 
for(key in yourDict) 
{ // this loop will not execute if the dictionary is empty 
    break; // exit loop as soon as we enter it (key will be set to some key) 
} 
id object = yourDict[key]; // get object associated with key. nil if key doesn't exist. 

Nota: Se il dizionario è vuoto, la chiave rimarrà nullo e anche l'oggetto restituito sarà nullo, pertanto non abbiamo bisogno di una gestione speciale del caso in cui il dizionario è effettivamente vuoto.

+0

Generalmente privilegio la leggibilità rispetto alla velocità/salvataggio della memoria –

1

Se qualcuno è ancora alla ricerca di risposta per questo tipo di situazione, allora questo può riferirsi:

// dict è NSDictionary

// [allKeys dict] vi darà tutte le chiavi in ​​dict presente

// [[dict allKeys] objectAtIndex: 0] darà da tutti gli oggetti keys all'indice 0 perché [dict allKeys] restituisce una matrice.

[[dict allKeys]objectAtIndex:0]; 
4

NSArray ha un selettore denominato firstObject che semplifica il codice e lo rende più leggibile:

id val = [[yourDict allValues] firstObject]; 

Se yourDict è vuota val sarà nil, quindi non è necessario controllare il dizionario/dimensione dell'array .

+1

Mentre ciò è vero, e salva una o due righe di codice, la domanda riguarda 'NSDictionary', non' NSArray'. – trojanfoe

+0

Sì, ed è il "primo" valore del dizionario che cosa ottieni con questo codice. È solo che utilizza una conversione di matrice, come quasi tutte le altre risposte. – ASLLOP

+0

Non c'è "prima" con un dizionario perché non ha ordine. Potresti ottenere un "primo" diverso ogni volta che aggiungi un oggetto al dizionario. – trojanfoe

1

più semplice:

[[dict objectEnumerator] nextObject]; 
Problemi correlati