La création d'une instance de la classe
NSDictionary est très similaire à celle d'une instance de la classe
NSArray. On retrouve la même forme pour les méthodes d'initialisation :
Code : Objective-C | NSDictionary * dict = [NSDictionary dictionaryWithObject:@"Genève" forKey:@"Ville"];
|
Dans cet exemple, on initialise un dictionnaire avec un seul couple clé-objet. La clé est une chaîne :
@"Ville" ; l'objet est également une chaîne :
@"Genève". Notez que le prototype de la méthode de classe définit les paramètres comme étant des objets de type
id, c'est-à-dire n'importe quels objets.
Et si on veut créer plusieurs couples dans un même dictionnaire, c'est possible ?
Bien sûr, mais il faut connaître les clés et les objets que l'on va fournir au dictionnaire. On doit créer deux tableaux qui vont contenir les objets et les clés, et ces tableaux seront passés en paramètre au dictionnaire.
Code : Objective-C | NSArray * lesObjets = [NSArray arrayWithObjects:@"Genève", @"Suisse", @"Europe", nil];
NSArray * lesCles = [NSArray arrayWithObjects:@"Ville", @"Pays", @"Continent", nil];
NSDictionary * dict = [NSDictionary dictionaryWithObjects:lesObjets forKeys:lesCles];
|
Attention : ici, l'ordre des objets et des clés est très important. Il faut que l'objet d'indice
i soit associé à la clé d'indice
i !
Comme l'initialisation d'un dictionnaire avec plusieurs paires clé-objet est une opération courante et que passer par des tableaux est un peu lourd, les développeurs ont construit une autre méthode de classe.
Code : Objective-C | NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Genève", @"Ville",
@"Suisse", @"Pays",
@"Europe", @"Continent", nil];
|
Comme vous pouvez le constater, on n'a plus besoin de tableau ici. En revanche, il faut faire attention aux paires : on donne toujours l'objet en premier, puis la clé qui lui est associée, et on termine la liste par
nil.
Manipuler les couples
Pour accéder au contenu d'un dictionnaire, on utilise la méthode
- objectForKey:, qui prend en paramètre la clé associée à l'objet. Par exemple, ce code :
Code : Objective-C | NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Genève", @"Ville",
@"Suisse", @"Pays",
@"Europe", @"Continent", nil];
NSLog (@"Vous habitez en %@, à %@ !", [dict objectForKey:@"Pays"], [dict objectForKey:@"Ville"]);
|
... va produire l'affichage suivant :
Code : Console | Vous habitez en Suisse, à Genève ! |
Facile, non ?
On peut même afficher un dictionnaire grâce à la fonction
NSLog(). Voici la
description de l'objet
dict (cf. le
TP de la partie I).
Code : Console | {
Ville = Genève;
Pays = Suisse;
Continent = Europe;
} |
Changer les couples
Tout comme une instance de
NSArray, une instance de
NSDictionary est immuable. Pour pouvoir modifier un dictionnaire, il faut une instance de la classe
NSMutableDictionary. On peut alors modifier les couples clé-objet :
Code : Objective-C | [dict setObject:nouvelObjet forKey:@"Clé"];
|
On a deux cas de figure ici :
- soit le couple ayant pour clé l'objet @"Clé" existe déjà : à ce moment-là, l'ancien objet reçoit le message - release, tandis que le nouvel objet prend sa place dans le dictionnaire et reçoit le message - retain ;
- soit le couple n'existe pas encore : il est alors créé.

Bien entendu, on peut aussi supprimer des objets grâce à la méthode
- removeObjectForKey:. Dans ce cas-ci, si la clé n'existe pas, il ne se passe rien. On peut également utiliser la méthode
- removeAllObjects qui, comme son nom l'indique, vide le dictionnaire.
Autres méthodes
Comme avec
NSArray, la classe
NSDictionary peut fournir des
NSEnumerator. En fait, elle peut en fournir deux : un pour les clés et un autre pour les objets. C'est très pratique pour parcourir un dictionnaire :
Code : Objective-C | /* On reprend le dictionnaire "dict" qui contient la ville "Genève" */
NSEnumerator * cleEnum = [dict keyEnumerator];
id cle = nil;
while (cle = [cleEnum nextObject]) {
NSLog (@"Clé : %@\nValeur : %@\n\n", cle, [dict objectForKey:cle]);
}
|
Code : Console | Clé : Ville
Valeur : Genève
Clé : Pays
Valeur : Suisse
Clé : Continent
Valeur : Europe |
Rien de bien sorcier, comme vous pouvez le constater.
On peut également récupérer les clés sous la forme d'un tableau grâce à la méthode
- allKeys, ou encore récupérer les objets grâce à
- allValues.
Si vous jetez un coup d'?il à la
documentation, vous pouvez remarquer que quelques méthodes s'écrivent avec le nom
object et que d'autres s'écrivent avec
value (on a par exemple
- objectForKey: et
- valueForKey:). À notre niveau, il n'y a pas de différence entre ces méthodes. Plus tard, nous verrons une nouvelle spécificité de l'Objective-C, nommée
KVC, qui expliquera la différence entre ces deux familles de méthodes.
Enfin, pour connaître le nombre de couples présents dans le dictionnaire, il suffit d'appeler la méthode
- count qui renvoie un
int.
Je vous laisse consulter la documentation de
NSDictionary si vous souhaitez approfondir vos connaissances de cette classe.