Ordre dans un dictionnaire

beltbelt Membre
18:30 modifié dans API AppKit #1
j'ai sauvé un dictionnaire dans un fichier .plist.
Avec Property List Editor, je constate que tout est OK et que les différentes {clés+valeurs} du dictionnaire sont bien dans le bon ordre.
Par contre, quand je charge les préférences, rien ne va plus, tout est dans le désordre.
Pour charger, je fais comme ci-dessous, alors si qq un voit où est le pb...
Merci d'avance.

NSUserDefaults *nspref = [ NSUserDefaults standardUserDefaults ] ;
NSDictionary *d = [ nspref dictionaryForKey: @clé dico ] ;
 
  NSLog( @dict = %@", d ) ;
 
  if ( d && [ d count ] )
  {
  NSEnumerator *e = [ d keyEnumerator ];
  id key ;

  while ( key = [ e nextObject] )
  {
  // traitement...
  }
  }

Réponses

  • 18:30 modifié #2
    Les clés ne sont pas ordonnées dans un dico. Si tu as vraiment besoin de traiter les éléments dans l'ordre, le mieux est ceci:

    [tt]NSArray* sortedKeys = [[dico allKeys] sortedArrayUsingSelector:@selector(compare:)]; //ou caseInsensitiveCompare, suivant tes besoins
    NSEnumerator* e = [sortedKeys objectEnumerator];
    NSString* key;
    while (key = [e nextObject]) {}[/tt]

    Une petite remarque, le test [tt]  if ( d && [ d count ] ) [/tt], si d vaut nil, [d keyEnumerator] aussi, et donc [e nextObject] aussi, la boucle ne sera donc pas exécutée. Si d existe et est vide, [e nextObject] vaudra nil au premier passage de la boucle, et donc rien ne sera fait.
  • beltbelt Membre
    18:30 modifié #3
    Merci pour la réponse

    Juste une remarque, si d vaut nil, le traitement n'est de toutes façon pas executé !
    Cela dit, j'ai rajouté if ( d && [ d count ] ) pour ne pas l'executer dans le cas où le dico ne comporterait aucune entrée !
  • 18:30 modifié #4
    Le traitement ne sera pas de toute façon pas exécuté car un dico vide donne un énumérateur vide.
  • 18:30 modifié #5
    if ([d count ]) n'est pas assez ?
  • 18:30 modifié #6
    Oui c'est suffisant.

    Mais ce test est fait de manière implicite par l'usage de l'énumérateur, donc dans ce cadre il ne sert à  rien.
Connectez-vous ou Inscrivez-vous pour répondre.