web-dev-qa-db-fra.com

Ajouter des valeurs dans NSMutableDictionary dans iOS avec Objective-C

Je commence le développement de objective-c Et je voudrais demander la meilleure façon d'implémenter une liste de clés et de valeurs.

Dans Delphi, il y a la classe TDictionary et je l'utilise comme ceci:

myDictionary : TDictionary<string, Integer>;

bool found = myDictionary.TryGetValue(myWord, currentValue);
if (found)
{
    myDictionary.AddOrSetValue(myWord, currentValue+1);
} 
else
{
    myDictionary.Add(myWord,1);
}

Comment puis-je le faire dans objective-c? Existe-t-il des fonctions équivalentes à la AddOrSetValue() or TryGetValue() mentionnée ci-dessus?

Je vous remercie.

15
Miguel E

Vous souhaitez implémenter votre exemple de la manière suivante:

MODIFIER:

//NSMutableDictionary myDictionary = [[NSMutableDictionary alloc] init];
NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];

NSNumber *value = [myDictionary objectForKey:myWord];

if (value)
{
    NSNumber *nextValue = [NSNumber numberWithInt:[value intValue] + 1];
    [myDictionary setObject:nextValue  forKey:myWord];
} 
else
{
    [myDictionary setObject:[NSNumber numberWithInt:1] forKey:myWord]
}

(Remarque: vous ne pouvez pas stocker des entiers ou d'autres primitives directement dans un NSMutableDictionary, d'où la nécessité de les encapsuler dans un objet NSNumber, et assurez-vous d'appeler [myDictionary release] lorsque vous avez terminé avec le dictionnaire).

49
Tom Jefferys

Les autres réponses sont correctes, mais il existe maintenant une syntaxe plus moderne. Plutôt que:

[myDictionary setObject:nextValue  forKey:myWord];

Vous pouvez simplement dire:

myDictionary[myWord] = nextValue;

De même, pour obtenir une valeur, vous pouvez utiliser myDictionary[key] pour obtenir la valeur (ou nil).

9
Jesse Rusak

Oui:

- (id)objectForKey:(id)key;
- (void)setObject:(id)object forKey:(id)key;

setObject:forKey: écrase tout objet existant avec la même clé; objectForKey: renvoie nil si l'objet n'existe pas.

Modifier:

Exemple:

- (void)doStuff {
  NSMutableDictionary *dict = [NSMutableDictionary dictionary];

  [dict setObject:@"Foo" forKey:@"Key_1"]; // adds @"Foo"
  [dict setObject:@"Bar" forKey:@"Key_2"]; // adds @"Bar"

  [dict setObject:@"Qux" forKey:@"Key_2"]; // overwrites @"Bar"!

  NSString *aString = [dict objectForKey:@"Key_1"]; // @"Foo"
  NSString *anotherString = [dict objectForKey:@"Key_2"]; // @"Qux"
  NSString *yas = [dict objectForKey:@"Key_3"]; // nil
}

Reedit: Pour l'exemple spécifique, il existe une approche plus compacte:

[dict
  setObject:
    [NSNumber numberWithInteger:([[dict objectForKey:@"key"] integerValue] + 1)]
  forKey:
    @"key"
 ];

Indentation folle pour la lisibilité.

4
Williham Totland