Llegar al nivel de niño más profundo en NSDictionary

Tengo un object NSDictionary con estructuras profundas como arrays que contienen una matriz adicional que contiene dictionarys …

Quiero search un object en la jerarquía. ¿Hay alguna forma de indexing directa para searchlos usando nombres de teclas u otra cosa?

Es un dolor seguir llamando a methos objectForKey varias veces para llegar al nivel más profundo del niño.

Para una estructura que incluye arreglos, no hay una forma incorporada para hacer algo como:

[dict objectForKey:@"[level1][level2][level3]"] 

Dicho eso, cualquier cosa construida es solo un código que alguien en Apple ha escrito, y tú puedes hacer lo mismo.

Escribe una class auxiliar que lo haga por ti en function de un esquema de concatenación key que crees, luego simplemente llámalo. Se saveá la duplicación de código.

Si solo usa dictionarys, y si las keys en sus dictionarys son siempre cadenas, puede usar la encoding de key-valor para recorrer varios niveles de dictionarys:

 id someObject = [mainDictionary valueForKey:@"apple.pear.orange.bear"]; 

Esto es equivalente a:

 NSDictionary *level2Dict = [mainDictionary objectForKey:@"apple"]; NSDictionary *level3Dict = [level2Dict objectForKey:@"pear"]; NSDictionary *level4Dict = [level3Dict objectForKey:@"orange"]; id someObject = [level4Dict objectForKey:@"bear"]; 

Esto no es tan conveniente, sin embargo, si también tiene matrices en la mezcla. Vea esta discusión SO reciente para get más información sobre este tema.

 // // NSDictionary+Path.h // // Created by Wu Li-chih on 10/3/12. // Copyright (c) 2012 Wu Li-chih. All rights reserved. // #import <Foundation/Foundation.h> @interface NSDictionary (Path) - (id) objectForPath:(NSArray*)aKeyPath; @end // // NSDictionary+Path.m // // Created by Wu Li-chih on 10/3/12. // Copyright (c) 2012 Wu Li-chih. All rights reserved. // #import "NSDictionary+Path.h" @implementation NSDictionary (Path) - (id) objectForPath:(NSArray*)aKeyPath { if([d isKindOfClass:[NSDictionary class]]) d = [d objectForKey:aKey]; else if([d isKindOfClass:[NSArray class]]) d = [d objectAtIndex:[aKey integerValue]]; else return nil; if(d == nil) return nil; } @end // example id v = [dict objectForPath:@[@"root", @"sub", @"target_node"]]; NSDictionary *a = @{ @"aaa" : @{ @"bbb": @[@123, @456, @{@"ccc": @"result"}]}}; id r = [a objectForPath:@[@"aaa", @"bbb", @2, @"ccc"]]; STAssertTrue([r isEqualToString:@"result"], nil); r = [a objectForPath:@[@"aaa", @"bbb", @0, @"ccc"]]; STAssertNil(r, nil);