web-dev-qa-db-fra.com

Comment obtenir le premier élément d'un NSDictionary?

J'ai une gamme de dictionnaires. Comment extraire le premier élément du dictionnaire?

   NSArray *messages = [[results objectForKey:@"messages"] valueForKey:@"message"];         
    for (NSDictionary *message in messages)
    {
        STObject *mySTObject = [[STObject alloc] init];
        mySTObject.stID = [message valueForKey:@"id"];      
        stID = mySTObject.stID;
    }
36
Sheehan Alam

Il n'y a pas de "premier" élément dans un NSDictionary; ses membres n'ont pas d'ordre garanti. Si vous voulez juste n objet d'un dictionnaire, mais ne vous souciez pas de la clé à laquelle il est associé, vous pouvez faire:

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

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

Les NSDictionaries ne sont pas ordonnés, ce qui signifie qu'il n'y a ni premier ni dernier élément. En fait, l'ordre des clés n'est jamais garanti identique, même pendant la durée de vie d'un dictionnaire spécifique.

Si vous voulez un objet, vous pouvez obtenir l'une des clés:

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

NSArray possède un sélecteur nommé firstObject qui simplifie le code et le rend plus lisible:

id val = [[yourDict allValues] firstObject];

Si yourDict est vide val sera nil, il n'est donc pas nécessaire de vérifier la taille du dictionnaire/tableau.

5
ASLLOP

Le plus simple:

[[dict objectEnumerator] nextObject];
3
Ivan

Si quelqu'un est toujours à la recherche d'une réponse pour ce type de situation, il peut se référer à ceci:

// dict est NSDictionary

// [dict allKeys] donnera toutes les clés de dict présentes

// [[dict allKeys] objectAtIndex: 0] donnera de tous les objets clés à l'index 0 car [dict allKeys] retourne un tableau.

[[dict allKeys]objectAtIndex:0];
1
1218GG

Selon Apple , les appels à allKeys ou allValues entraînent le coût de création de nouveaux tableaux:

Un nouveau tableau contenant les valeurs du dictionnaire, ou un tableau vide si le dictionnaire n'a pas d'entrées (lecture seule)

Ainsi, une option alternative qui n'engendre pas de tels coûts pourrait ressembler à ceci:

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.

Remarque: Si le dictionnaire est vide, la clé restera nulle et l'objet retourné sera également nul, nous n'avons donc pas besoin d'une gestion spéciale du cas où le dictionnaire est réellement vide.

1
LZM

Si vous avez NSDictionary nommé message, c'est assez simple:

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

Mais vous devez être sûr (ou mieux vérifier) ​​que votre dictionnaire contient au moins un élément. Voici comment vous pouvez le vérifier:

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

Mais NSDictionary n'a pas d'ordre garanti, vous ne devriez donc probablement utiliser ce code que si votre dictionnaire ne contient qu'un seul élément.

[MISE À JOUR] C'est aussi une bonne idée de l'utiliser si vous avez besoin d'obtenir N'IMPORTE QUEL élément du dictionnaire

0
n0_quarter