2010-05-07 9 views

Répondre

67

Regardez à la classe parente (NSDictionary)

- (NSArray *)allKeysForObject:(id)anObject 

qui retournera un NSArray de toutes les clés pour une valeur d'un objet. MAIS il le fait en envoyant un message isEqual à chaque objet du dictionnaire, donc pour votre grand ensemble de données, cela peut ne pas être la meilleure performance.

Peut-être que vous avez besoin de tenir une certaine forme de structure de structure d'indexation supplémentaire (s) pour vous permettre de localiser les objets sur certaines valeurs critiques en leur sein, liée à la clé sans comparaison d'objet direct

6

Jetez un oeil à:

- (NSArray *)allKeysForObject:(id)anObject 
19

Pour répondre à votre question dans de manière plus spécifique, utilisez ce qui suit pour obtenir une clé pour un objet particulier:

NSString *knownObject = @"the object"; 
NSArray *temp = [dict allKeysForObject:knownObject]; 
NSString *key = [temp objectAtIndex:0]; 

//"key" is now equal to the key of the object you were looking for 
6

qui est certainement possible avec la méthode des blocs de NSDictionary

- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate; 

Vous devez renvoyer des objets qui satisfont certaines conditions (prédicat).

utiliser comme ceci:

NSSet *keys = [myDictionary keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) { 

     BOOL found = (objectForWhichIWantTheKey == obj); 
     if (found) *stop = YES; 
     return found; 

    }]; 

Vérifiez cette réponse pour plus de détails

How do I specify the block object/predicate required by NSDictionary's keysOfEntriesPassingTest?