web-dev-qa-db-fra.com

Comment pouvons-nous stocker dans un NSDictionary? Quelle est la différence entre NSDictionary et NSMutableDictionary?

Je développe une application dans laquelle je veux utiliser un NSDictionary. Quelqu'un peut-il m'envoyer un exemple de code expliquant la procédure à suivre pour utiliser un NSDictionary pour stocker des données avec un exemple parfait?

68
Pradeep Reddy Kypa

Les docs NSDictionary et NSMutableDictionary sont probablement votre meilleur choix. Ils ont même d'excellents exemples sur la façon de faire diverses choses, comme ...

... créer un NSDictionary

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", nil];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                                                       forKeys:keys];

... parcourez-le

for (id key in dictionary) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

... rendez-le mutable

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Remarque: version historique antérieure à 2010: [[dictionary mutableCopy] autorelease]

... et modifiez-le

[mutableDict setObject:@"value3" forKey:@"key3"];

... puis enregistrez-le dans un fichier

[mutableDict writeToFile:@"path/to/file" atomically:YES];

... et relisez-le

NSMutableDictionary *anotherDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"path/to/file"];

... lit une valeur

NSString *x = [anotherDict objectForKey:@"key1"];

... vérifier si une clé existe

if ( [anotherDict objectForKey:@"key999"] == nil ) NSLog(@"that key is not there");

... utilise une syntaxe effrayante et futuriste

À partir de 2014, vous pouvez taper simplement dict [@ "key"] plutôt que [dict objectForKey: @ "key"]

191
Tim
NSDictionary   *dict = [NSDictionary dictionaryWithObject: @"String" forKey: @"Test"];
NSMutableDictionary *anotherDict = [NSMutableDictionary dictionary];

[anotherDict setObject: dict forKey: "sub-dictionary-key"];
[anotherDict setObject: @"Another String" forKey: @"another test"];

NSLog(@"Dictionary: %@, Mutable Dictionary: %@", dict, anotherDict);

// now we can save these to a file
NSString   *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath];
[anotherDict writeToFile: savePath atomically: YES];

//and restore them
NSMutableDictionary  *restored = [NSDictionary dictionaryWithContentsOfFile: savePath];
32
Ben Gottlieb

La principale différence: NSMutableDictionary peut être modifié sur place, NSDictionary ne peut pas. Cela est vrai pour toutes les autres classes NSMutable * de Cocoa. NSMutableDictionary est une sous-classe de NSDictionary, de sorte que tout ce que vous pouvez faire avec NSDictionary est réalisable avec les deux. Cependant, NSMutableDictionary ajoute également des méthodes complémentaires pour modifier les éléments en place, telles que la méthode setObject:forKey:.

Vous pouvez convertir entre les deux comme ceci:

NSMutableDictionary *mutable = [[dict mutableCopy] autorelease];
NSDictionary *dict = [[mutable copy] autorelease]; 

Vous voulez probablement stocker des données en les écrivant dans un fichier. NSDictionary a une méthode pour le faire (qui fonctionne aussi avec NSMutableDictionary):

BOOL success = [dict writeToFile:@"/file/path" atomically:YES];

Pour lire un dictionnaire depuis un fichier, il existe une méthode correspondante:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/file/path"];

Si vous voulez lire le fichier en tant que NSMutableDictionary, utilisez simplement:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/file/path"];
18
jtbandes