So fügen Sie einem NSDictionary hinzu

91

Ich habe ein NSMutableArray und festgestellt, dass die Verwendung eines Wörterbuchs für das, was ich erreichen möchte, viel einfacher ist.

Ich möchte einen Schlüssel als NSStringund einen Wert als intim Wörterbuch speichern . Wie wird das gemacht? Zweitens, was ist der Unterschied zwischen veränderlichen und einem normalen Wörterbuch?

System
quelle

Antworten:

197

Ein veränderbares Wörterbuch kann geändert werden, dh Sie können Objekte hinzufügen und entfernen. Eine unveränderliche wird behoben, sobald sie erstellt wurde.

erstellen und hinzufügen:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

und abrufen:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];
Eiko
quelle
Müssen Sie mit einer Kapazität initiieren oder kann es nur dynamisch sein?
muttley91
2
Sie müssen die anfängliche Kapazität nicht angeben, können jedoch Leistungssteigerungen feststellen, wenn Sie dies tun. Wenn Sie im Voraus wissen, wie viele Elemente es enthalten wird, geben Sie diese Nummer oder einen etwas größeren Wert an.
Eiko
Fragen Sie nach NSDictionary nicht nach NSMutableDictionary?
Ananta Prasad
34

Durch die Einstellung würden Sie verwenden setValue:(id)value forKey:(id)keyMethode des NSMutableDictionaryObjekts:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Oder im modernen Objective-C:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

Der Unterschied zwischen veränderlich und "normal" ist die Veränderlichkeit. Dh Sie können den Inhalt von NSMutableDictionary(und NSMutableArray) ändern, während Sie dies nicht mit "normal" NSDictionaryund tun könnenNSArray

Eimantas
quelle
2
Sollten Sie diese Ganzzahl nicht in eine NS-Nummer einschließen?
Johan Kool
Ich habe noch ein Problem damit. Ich muss einen vom Benutzer eingegebenen Text als Zeichenfolge sowie die Bildreferenz (den Index im Array von Bildern) speichern, in der der Benutzer den Text speichert. Ich habe ein mutableArray von Objekten mit 2 Variablen ausprobiert, eine für jedes, das ich gerade erwähnt habe. Das funktionierte nicht gut, wenn versucht wurde, die tableView mit den Textwerten der Array-Objekte zu füllen. Also dachte ich an ein Wörterbuch. Das einzige Problem ist, dass es nicht so aussieht, als könnte ich Daten per Index abrufen. Es muss ein Schlüssel oder ein Wert wie eine Hashmap sein, oder?
System
@ Johan - richtig und aktualisiert! @alJaree - ja, das Wörterbuch ist eine Art Schlüsselwertspeicher. Ich denke, in Ihrer Position wären Sie mit einer Reihe von Wörterbüchern besser dran. So etwas wie[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas
Dies funktioniert bei mir immer noch nicht, da ich Text von jedem Objekt abrufen und damit die Favoriten-UITableView füllen muss. Außerdem benötige ich einen Indexverweis auf das Bildarray, damit ich das ausgewählte Lieblingsbild abrufen und anzeigen kann. Ich habe das oben beschriebene Objekt ausprobiert, aber die zurückgegebenen Objekte beim Lesen aus dem Array, in dem NSStrings aus irgendeinem Grund statt des spezifischen Objekts, das gespeichert wurde. Ich bin nicht sicher, was ich hier tun soll,
System
Ich denke, dass ich möglicherweise nur NSStrings wie @ "% d _% @, index, savedTitle speichern und dann einfach den NSString teilen und nehmen und dipayen muss, was ich brauche. Ich denke in Java-Begriffen, sicher, dass es einen geben muss Split-Funktion in obj c. :)
System
16

Wann immer das Array deklariert wird, müssen nur wir die Schlüsselwerte in NSDictionary wie hinzufügen

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

Wir können die Schlüsselwerte in diesem NSDictionary nicht hinzufügen oder entfernen

Wo wie in NSMutableDictionary können wir die Objekte nach der Initialisierung des Arrays auch mit dieser Methode hinzufügen

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

Zum Entfernen des Schlüsselwerts müssen wir den folgenden Code verwenden

[mutableDict removeObject:@"Value1" forKey:@"Key1"];
Madhu
quelle
12

Update-Version

Ziel c

Erstellen:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Veränderung:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

Die Kurzhandsyntax wird aufgerufen Objective-C Literals.

Schnell

Erstellen:

var dictionary = ["myKey1": 7, "myKey2": 5]

Veränderung:

dictionary["myKey3"] = 3
Warif Akhand Rishi
quelle
1

Sie möchten fragen: "Was ist der Unterschied zwischen einem veränderlichen und einem nicht veränderlichen Array oder Wörterbuch?" Oft werden dort unterschiedliche Begriffe verwendet, um Dinge zu beschreiben, über die Sie bereits Bescheid wissen. In diesem Fall können Sie den Begriff "veränderlich" durch "dynamisch" ersetzen. Ein veränderbares Wörterbuch oder Array ist also ein "dynamisches" Wörterbuch, das sich zur Laufzeit ändern kann, während ein nicht veränderliches Wörterbuch oder Array ein "statisches" Wörterbuch oder Array ist, das "statisch" ist und in Ihrem Code definiert ist und sich zur Laufzeit nicht ändert (mit anderen Worten , Sie werden die Elemente nicht hinzufügen, löschen oder möglicherweise sortieren.)

Wie es gemacht wird, bitten Sie uns, die Dokumentation hier zu wiederholen. Alles, was Sie tun müssen, ist, im Beispielcode und in der Xcode-Dokumentation zu suchen, um genau zu sehen, wie es gemacht wird. Aber das veränderliche Ding warf mich auch, als ich das erste Mal lernte, also gebe ich dir das!

Mark Hernandez
quelle
Manchmal gibt es keine ausreichend anständige Erklärung für die Xcode-Dokumente, es wird eine tiefe Theorie ohne klare Beispiele, nicht immer, aber manchmal. : P Ja, ich verstehe den veränderlichen (mutierbaren) Teil jetzt danke. :)
System
0

Als Referenz können Sie auch verwenden, initWithDictionaryum das NSMutableDictionarymit einem wörtlichen zu initiieren:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Topher Fangio
quelle