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.
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).
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).
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é.