2012-09-19 8 views
4

Ok j'ai un fichier .plist,NSDictionary intérieur NSDictionary

dans lequel je un NSDictionary *StoredAddresses,

intérieur StoredAddresses, est une autre poignée de NSDictionary

Je sais que je peux utiliser,

if ([dictionaryOfAddresses objectForKey:@"StoredAddresses"]) 

Pour accéder aux NSDictionary de niveau supérieur, mais comment puis-je rechercher des clés dans les adresses stockées?

Répondre

10

Bien, je f J'ai lu ceci correctement, vous avez des dictionnaires dans les dictionnaires. Cela fonctionne comme tout autre objet:

NSDictionary* Address=[dictionaryOfAddresses objectForKey:@"Home Address"]; 
NSString* Street=[Address objectForKey:@"Street"]; 

Vous pouvez combiner les appels si vous voulez:

NSString* Street=[[dictionaryOfAddresses objectForKey:@"Home Address"] objectForKey:@"Street"]; 
+0

merci beaucoup, et je suppose que je peux ajouter même une troisième couche dans ce domaine? –

+0

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é. –

+1

Avec la syntaxe moderne Objective-C, vous pouvez également utiliser dictionaryOfAddresses [@ "Home Address"] [@ "Street"] à la place. :) –

0

Cela retourne le tableau des clés à l'intérieur StoredAddresses

yourArray=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] allKeys]; 

alors vous pouvez imprimer le yourArray et voir les touches, puis après avoir pris connaissance des touches que vous pouvez accéder à l'aide soit

dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:[yourArray objectAtIndex:index_for_that_key]]; 

ou

dict=[[dictionaryOfAddresses objectForKey:@"StoredAddresses"] objectForKey:@"key_for_your_dict"]; 
+0

merci c'est génial! –

+0

vous êtes les bienvenus. – Neo

2

Vous pouvez utiliser la méthode NSKeyValueCodingvalueForKeyPath: 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"]; 
1

Une autre nouvelle façon de sous-dictionnaires qui fait un certain code est la notation abrégée suivante:

NSString *street = dictionaryOfAddresses[@"HomeAddress"][@"Street"];