Frage

Ich habe ein NSDictionary Objekt, das von NSMutableStrings für seine Schlüssel und Objekte gefüllt wird. Ich konnte den Schlüssel ändern, indem den ursprünglichen NSMutableString mit dem setString Wechsel: Methode. Der Schlüssel bleibt jedoch gleich, unabhängig von dem Inhalt der Zeichenfolge verwendet zunächst den Schlüssel zu setzen.

Meine Frage ist, ist der Schlüssel aus geschützten geändert wird was bedeutet, es wird immer das gleiche sein, wenn ich es entfernen und ein anderes zum Wörterbuch hinzufügen?

Danke.

War es hilfreich?

Lösung

Die Tasten sind -copy'd wenn die Elemente festgelegt sind, so dass Sie es nicht zu ändern können danach nutzlos ist.

Methoden, die Einträge auf Wörterbücher-ob als Teil der Initialisierung hinzufügen (für alle Wörterbücher) oder bei Änderung (für wandelbar Wörterbücher) -Kopieren jedes Schlüsselargument (Schlüssel zum NSCopying Protokoll entsprechen muß) und fügen Sie die Kopien in das Wörterbuch. Jedes entsprechendes Wertobjekt erhält eine Nachricht behalten, um sicherzustellen, dass sie nicht freigegeben werden, bevor das Wörterbuch durch mit ihm ist.

Sie könnten CFDictionary mit kCFTypeDictionaryKeyCallBacks verwenden, oder ersetzen Sie einfach den Artikel:

id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];

Andere Tipps

Versuchen NSMutableDictionary verwenden, statt.

Sie können eine Kopie des Wörterbuchs erstellen, das Filtern der Schlüssel, wie Sie gehen. Ich tue dies für die Umwandlung zwischen Kamel-Fall und Unterstrichen, wenn Objekte von JSON mit KVC bevölkern. Siehe meine Refactoring Bibliothek, es_ios_utils , für Quelle. ESNSCategories.h sieht vor:

@interface NSMutableDictionary(ESUtils)
    //Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
    -(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...

So sind alle Tasten Großbuchstaben zu machen, können Sie etwas tun könnte, wie:

NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
               withKeyFilter:^NSString*(NSString *key) { 
                                 return key.uppercaseString;
                             }];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top