2009-10-18 7 views
1

Je pensais qu'il serait plus simple de trouver un objet dans un dictionnaire, mais il semble que ce ne soit pas le cas.Cocoa et Cocoa Touch: un objet dans le dictionnaire?

J'ai un NSMutableDictionary avec juste une clé nommée "produits".

J'ai plusieurs produits ajoutés au dictionnaire dynamique, en utilisant quelque chose comme

[myDict addObject:@"banana" forKey:@"products"]; 
[myDict addObject:@"orange" forKey:@"products"]; 
[myDict addObject:@"grapes" forKey:@"products"]; 

etc.

À un moment donné, je voudrais savoir si, par exemple, la banane est sur le dictionnaire.

Y a-t-il un moyen de faire cela? Je veux dire, juste pour savoir si un objet est dans le dictionnaire?

merci pour toute aide.

Répondre

2

Vous pouvez mettre ce que vous voulez comme objet. L'utilisation de objectForKey renverra nil si l'objet n'est pas dans le dictionnaire et retournera l'objet si c'est le cas. Vous pouvez l'utiliser comme ceci:

[myDict addObject:@"WHATEVER YOU WANT" forKey:@"banana"]; 
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"orange"]; 
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"grapes"]; 
.. 
.. 
.. 
if ([myDict objectForKey:@"banana"]) { 
    // I have a banana 
} 
if ([myDict objectForKey:@"orange"]) { 
    // I have an orange 
} 
if ([myDict objectForKey:@"grapes"]) { 
    // I have grapes 
} 
+0

merci. Toutes les solutions sont bonnes mais c'est le plus simple !!!! – SpaceDog

+0

Si vous pensez que cela va marcher pour vous, pourquoi ne pas simplement utiliser un NSSet? – bbum

7

Vous vous méprenez sur le fonctionnement des dictionnaires. Les dictionnaires stockent une valeur unique pour une clé simple. Ainsi, après l'exécution de votre code, myDict contiendra une seule paire valeur/clé: @"products" =>@"grapes". Si vous avez besoin d'une clé pour pointer sur plusieurs objets, alors votre clé devra pointer vers un NSMutableArray (ou NSMutableSet si vous ne vous souciez pas de la commande), puis vous ajouterez et supprimerez des choses du NSMutableArray plutôt que du dictionnaire.

Si cela va être la structure de base pour tout dans votre dictionnaire, vous voudrez peut-être envisager de faire un wrapper pour votre dictionnaire, comme ceci:

//DDMutableMultiValueDictionary.h 
@interface DDMutableMultiValueDictionary : NSObject { 
    NSMutableDictionary * dict; 
} 

- (void) addObject:(id)value forKey:(id)key; 
- (void) removeObject:(id)value forKey:(id)key; 
- (BOOL) containsObject:(id)value forKey:(id)key; 

@end 

//DDMutableMultiValueDictionary.m 
#import "DDMutableMultiValueDictionary.h" 

@implementation DDMutableMultiValueDictionary 

- (id) init { 
    if (self = [super init]) { 
    dict = [[NSMutableDictionary alloc] init]; 
    } 
    return self; 
} 

- (void) dealloc { 
    [dict release]; 
    [super dealloc]; 
} 

- (void) addObject:(id)value forKey:(id)key { 
    NSMutableArray * values = [dict objectForKey:key]; 
    if (values == nil) { 
    values = [NSMutableArray array]; 
    [dict setObject:values forKey:key] 
    } 
    [values addObject:value]; 
} 

- (void) removeObject:(id)value forKey:(id)key { 
    NSMutableArray * values = [dict objectForKey:key]; 
    [values removeObject:value]; 
} 

- (BOOL) containsObject:(id)value forKey:(id)key { 
    NSMutableArray * values = [dict objectForKey:key]; 
    return [values containsObject:value]; 
} 

@end 

Ce n'est pas complète par tout moyen, mais cela vous donne une idée de comment vous pourriez le faire.

+0

merci !!!! Votre solution ira dans un autre cas que j'ai! :-) – SpaceDog

+0

Ou simplement créer un objet modèle pour tout ce qui a des produits, et lui donner une propriété 'products' par laquelle il possède le tableau ou l'ensemble. –

2

Je suis d'accord avec les autres affiches que vous pourriez mal comprendre comment fonctionnent les dictionnaires. Mais au hasard, c'est utile, voici comment vous pourriez voir si un objet spécifique est présent en tant que valeur, et pour quelle (s) touche (s):

// assume the object you're looking for is in the variable myValue 
NSArray *keys = [myDict allKeysForObject:myValue]; 
if([keys count]) { 
    // do whatever ... 
} 
+0

+1 Ce n'est pas souvent que je vois un cas d'utilisation valide pour 'allKeysForObject:'. Je ne l'ai jamais utilisé moi-même. –

+0

bonne solution, merci! – SpaceDog

Questions connexes