Buscando un valor en una profundidad de NSMutableArray desconocida

Ok, como que hice la pregunta incorrecta, he editado la pregunta original.

Estoy almacenando Arrays dentro de Arrays, así como también en NSDictionaries. Es un tipo de aplicación de utilidad y no existe una estructura establecida, el usuario puede ingresar información anidada tanto como lo requiera.

Lo ideal es que necesite un método para desplazarse por todo el contenido de mi matriz dado un parámetro establecido (un tipo de class, tal vez una key de dictionary). Aquí hay un ejemplo …

NSMutableArray *array = [[NSMutableArray alloc]init]; NSMutableDictionary *entenetworkingItem = [[NSMutableDictionary alloc]init]; [entenetworkingItem setObject:@"i'm a title" forKey:@"title"]; [entenetworkingItem setObject:@"i'm an id" forKey:@"id"]; [entenetworkingItem setObject:@"i'm a description" forKey:@"description"]; [entenetworkingItem setObject:@"i'm a timestamp" forKey:@"timestamp"]; [entenetworkingItem setObject:array forKey:@"items"]; [array addObject:entenetworkingItem]; [array addObject:anotherDictionary]; [array addObject:moreDictionaries]; 

Entonces, en el ejemplo anterior, necesitaría encontrar el dictionary (y devolverlo) que contenga @ "soy un id".

Espero que mi pregunta sea clara. Gracias por cualquier ayuda que pueda ofrecer.

El enfoque recursivo es correcto, pero no estoy seguro de que las muestras de código fueran muy útiles si aún no sabes la recursion. Aquí hay una solución de trabajo:

Agregue estos methods:

 - (id)findObjectWithKey:(id)key inArray:(NSArray *)array { for (id object in array) { if ([object isKindOfClass:[NSArray class]]) { return [self findObjectWithKey:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findObjectWithKey:key inDictionary:object]; } } return nil; } - (id)findObjectWithKey:(id)key inDictionary:(NSDictionary *)dict { for (id subKey in dict) { id object = [dict objectForKey:subKey]; if ([subKey isEqual:key]) { return object; } else if ([object isKindOfClass:[NSArray class]]) { return [self findObjectWithKey:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findObjectWithKey:key inDictionary:object]; } } return nil; } 

Luego para encontrar su object, simplemente diga:

 id object = [self findObjectForKey:@"title" inArray:array]; 

Para modificar los methods para encontrar un object específico y devolver la key del dictionary, haz esto:

 - (id)findKeyWithObject:(id)key inArray:(NSArray *)array { for (id object in array) { if ([object isKindOfClass:[NSArray class]]) { return [self findKeyWithObject:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findKeyWithObject:key inDictionary:object]; } } return nil; } - (id)findKeyWithObject:(id)object inDictionary:(NSDictionary *)dict { for (id key in dict) { id subObject = [dict objectForKey:key]; if ([subObject isEqual:object]) { return key; } else if ([subObject isKindOfClass:[NSArray class]]) { return [self findKeyWithObject:object inArray:object]; } else if ([subObject isKindOfClass:[NSDictionary class]]) { return [self findKeyWithObject:object inDictionary:object]; } } return nil; } 

Luego, para encontrar su key, simplemente diga:

 id key = [self findKeyWithObject:object inArray:array]; 

¿Qué tal una búsqueda recursiva?

 - (void) searchRecursive :(NSArray *) array { NSEnumerator *e = [array objectEnumerator]; id obj; while ((obj = [e nextObject])) { if ([e isKindOfClass [NSArray class]]) [self searchRecursive :obj] else objobject ... forKey ... 

Como dice ott, un enfoque recursivo se ajustaría a sus requisitos. También deberá verificar si un dictionary contiene las keys que desea (porque supongo que puede tener diferentes types de objects representados por dictionarys …). Tal vez podría crear una categoría NSDictionary para verificar si coincide dentro de un tipo de class de dictionary.

Quiero decir:

 - (void)isType1 { return (([self objectForKey:@"title"] != nil) && [self objectForKey:@"id"] != nil) && ...); } 

Sé que podría ser más "sofisticado", pero esto puede ser útil.