Wie können wir in einem NSDictionary speichern? Was ist der Unterschied zwischen NSDictionary und NSMutableDictionary?

68

Ich entwickle eine Anwendung, in der ich eine verwenden möchte NSDictionary. Kann mir bitte jemand einen Beispielcode senden, in dem die Vorgehensweise NSDictionaryzum Speichern von Daten anhand eines perfekten Beispiels erläutert wird ?

Pradeep Reddy Kypa
quelle
52
Sie können beginnen, indem Sie einen Blick auf die NSDictionary-Dokumentation werfen ...
stefanB
7
Die höflichen RTFMs wirken irgendwie ätzender als die expliziten.
Dom Vinyard
1
@stefanB Für viele neue Programmierer ist die offizielle Dokumentation oft sehr kompliziert und verwirrend, so dass eine grundlegende Ansicht von x auf SO hilfreich ist.
Lazar Kukolj

Antworten:

191

Die Dokumente NSDictionary und NSMutableDictionary sind wahrscheinlich die beste Wahl . Sie haben sogar einige großartige Beispiele, wie man verschiedene Dinge macht, wie ...

... ein NSDictionary erstellen

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

... darüber iterieren

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

... mach es veränderlich

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Hinweis: historische Version vor 2010: [[dictionary mutableCopy] autorelease]

... und ändere es

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

... dann in einer Datei speichern

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

... und lies es noch einmal zurück

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

... einen Wert lesen

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

... prüfen, ob ein Schlüssel vorhanden ist

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

... verwenden Sie eine beängstigende futuristische Syntax

Ab 2014 können Sie tatsächlich nur dict [@ "key"] anstelle von [dict objectForKey: @ "key"] eingeben.

Tim
quelle
32
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];
Ben Gottlieb
quelle
@ Ben Gottlieb Teil Eins: Danke für nette Erklärungen. Eigentlich möchte ich zwei meiner UItextField-Daten in einer Datei aus MutableDictionary speichern. Hier hast du geschrieben NSString *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath];, jetzt ist meine Frage, was ist die Saved.dataDatei hier? Wie kann ich es schaffen?
Tulon
@ Ben Gottlieb Teil 2: Und in meinem Fall habe ich eine Textdatei (.rtf) in das folgende Verzeichnis Supporting files > MediaFiles > Documents > userData.rtfgestellt. Kann ich diese Art von Mutabledictionary-Daten jetzt in einer Textdatei speichern? Und was ist in diesem Fall das perfekte Verzeichnis? Ich war mit diesem Versuch [userData writeToFile:@"MediaFiles/Documents/userData.rtf" atomically:YES];und mit diesem [userData writeToFile:@"Documents/userData.rtf" atomically:YES];, aber hat nicht funktioniert. Haben Sie einen guten Tag.
Tulon
18

Der Hauptunterschied: NSMutableDictionary kann an Ort und Stelle geändert werden, NSDictionary nicht . Dies gilt für alle anderen NSMutable * -Klassen in Cocoa. NSMutableDictionary ist eine Unterklasse von NSDictionary. Alles, was Sie mit NSDictionary tun können, können Sie mit beiden tun. NSMutableDictionary fügt jedoch auch ergänzende Methoden hinzu, um vorhandene Elemente zu ändern, z. B. die Methode setObject:forKey:.

Sie können zwischen den beiden wie folgt konvertieren:

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

Vermutlich möchten Sie Daten speichern, indem Sie sie in eine Datei schreiben. NSDictionary hat eine Methode, um dies zu tun (die auch mit NSMutableDictionary funktioniert):

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

Um ein Wörterbuch aus einer Datei zu lesen, gibt es eine entsprechende Methode:

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

Wenn Sie die Datei als NSMutableDictionary lesen möchten, verwenden Sie einfach:

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