web-dev-qa-db-fra.com

Comment obtenir la clé d'un objet donné à partir d'un NSMutableDictionary?

J'ai un objet qui se trouve dans un grand NSMutableDictionary, et j'ai besoin de savoir de quelle clé il s'agit. Je veux donc rechercher ce "tableau" dans les deux colonnes. Non seulement avec des clés, mais aussi avec des objets (pour obtenir des clés). Est-ce possible?

32

Regardez la classe parent (NSDictionary)

- (NSArray *)allKeysForObject:(id)anObject

Qui renverra un NSArray de toutes les clés pour une valeur d'objet donnée. MAIS il le fait en envoyant un message isEqual à chaque objet du dictionnaire, donc pour votre grand ensemble de données, ce n'est peut-être pas la meilleure performance.

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

69
Kevin

Pour répondre à votre question d'une 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
19
AddisDev

C'est définitivement possible avec la méthode de blocage de NSDictionary

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

Vous devez renvoyer des objets qui remplissent une condition (prédicat).

Utilisez-le comme ceci:

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

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

    }];

Consultez cette réponse pour plus de détails

Comment spécifier l'objet/prédicat de bloc requis par keysOfEntriesPassingTest de NSDictionary?

6
valdyr

Jeter un coup d'œil à:

- (NSArray *)allKeysForObject:(id)anObject
6
Tom Irving