Vous pouvez utiliser la méthode NSKeyValueCoding
valueForKeyPath:
pour accéder aux propriétés d'objets imbriquées. Par exemple, étant donné les dictionnaires suivants ...
NSDictionary *homeAddressDict = @{ @"street" : @"2 Elm St.", @"city" : @"Reston" };
NSDictionary *addressesDict = @{ @"home" : homeAddressDict };
... vous pouvez accéder aux valeurs du dictionnaire home
imbriqué comme suit:
NSString *street = [addressesDict valueForKeyPath:@"home.street"];
NSString *city = [addressesDict valueForKeyPath:@"home.city"];
Cela fonctionne même pour les chemins plus profondément imbriqués, pour exemple:
NSDictionary *contactDict = @{ @"name" : @"Jim Ray", @"addresses" : addressesDict };
NSString *street2 = [contactDict valueForKeyPath:@"addresses.home.street"];
NSString *city2 = [contactDict valueForKeyPath:@"addresses.home.city"];
Notez que cela fonctionnera indépendamment du fait que les objets sont des instances de NSDictionary
ou une classe personnalisée qui descend de NSObject
, à condition que la classe personnalisée possède des propriétés ou des variables d'instance dont les noms correspondent aux clés.
Ainsi, par exemple, au lieu d'utiliser un NSDictionary
pour l'adresse de la maison, vous pouvez remplacer une instance d'une classe personnalisée Address
qui avait des propriétés déclarées, les méthodes de lecture, ou les variables d'instance nommée rue et ville (ou variables d'instance nommé _street et _city), et y accéder toujours de la même manière.
Et si l'objet contenant la propriété cible est mutable (par exemple une instance de NSMutableDictionary
), vous pouvez même modifier la valeur en utilisant le même mécanisme, par exemple:
[contactDict setValue:@"Herndon" forKeyPath:@"addresses.home.city"];
merci beaucoup, et je suppose que je peux ajouter même une troisième couche dans ce domaine? –
Vous pouvez ajouter autant de "couches" que vous le souhaitez. La seule chose qui compte est que vous sachiez quel objet vous obtenez dans chaque cas. Les chaînes et les dictionnaires ne sont pas les seules options, vous pouvez également avoir des tableaux, des dates ou des nombres. Les dictionnaires sont simplement "donnés une clé, retournent la valeur qui leur est associée". Le dictionnaire se fiche du type de valeur stockée sur une clé. –
Avec la syntaxe moderne Objective-C, vous pouvez également utiliser dictionaryOfAddresses [@ "Home Address"] [@ "Street"] à la place. :) –