68 votes

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

Je suis en train de développer une application dans laquelle je veux utiliser un fichier de type NSDictionary . Quelqu'un peut-il m'envoyer un exemple de code expliquant la procédure d'utilisation d'une NSDictionary pour stocker des données avec un exemple parfait ?

191voto

Tim Points 33042

Le site NSDictionary et NSMutableDictionary Les docs sont probablement votre meilleure chance. Ils ont même de bons 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];

...itérer sur elle

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

...le rendre mutable

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Note : version historique avant 2010 : [[dictionnaire mutableCopy] autorelease]

...et le modifier

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

...puis le stocker dans un fichier

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

...et le relire à nouveau

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

...lire une valeur

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

...vérifier si une clé existe

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

...utiliser une syntaxe futuriste effrayante

Depuis 2014, vous pouvez en fait simplement taper dict[@"key"] plutôt que [dict objectForKey:@"key"].

32voto

Ben Gottlieb Points 59900
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];

18voto

jtbandes Points 39804

La différence essentielle : NSMutableDictionary peut être modifié sur place, NSDictionary ne le peut pas. . Ceci est vrai pour toutes les autres classes NSMutable* de Cocoa. NSMutableDictionary est un sous-classe de NSDictionary, donc tout ce que vous pouvez faire avec NSDictionary, vous pouvez le faire avec les deux. Cependant, NSMutableDictionary ajoute également des méthodes complémentaires pour modifier les choses en place, comme la méthode setObject:forKey: .

Vous pouvez convertir les deux comme suit :

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

On peut supposer que vous voulez stocker des données en les écrivant dans un fichier. NSDictionary dispose d'une méthode pour ce faire (qui fonctionne également 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 comme un NSMutableDictionary, utilisez simplement :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X