2016-06-23 5 views
2

Ich fragte mich, wofür diese Bequemlichkeitsmethode stand, aber konnte keine Antworten dafür finden.Extrahieren von Wert von NSDictionary mit Klammern vs. objectForKey: oder valueForKey:

Was genau macht theDictionary[@"key"], wenn Sie einen Wert aus einem Wörterbuch extrahieren möchten? Verwendet es valueForKey: oder objectForKey:?

Was ist eine bessere Leistung? Ist es besser, die ganze Nachricht wie [theDictionary objectForKey:@"key"] zu schreiben oder ist die Bequemlichkeitsmethode ausreichend?

+0

[Zugriff auf Schlüssel in NSDictionary mit Schlüssel-Notation] (http://stackoverflow.com/q/14878468) –

Antwort

1

NSDictionary bietet die Methode objectForKey: Zugriff auf seinen Inhalt. Der Unterschied zu valueForKey: wird in dieser verwandten Frage ausführlich erläutert: Difference between objectForKey and valueForKey?.

Der Operator [] ist eine Verknüpfung zu objectForKey:. Was auch immer Sie verwenden, ist nicht wirklich wichtig, aber das vorherige ist leichter zu lesen (weniger Code-Rauschen), sofort klar in seiner Absicht, und Sie müssen nicht darüber nachdenken, ob es objectForKey: oder valueForKey: ist.

So persönlich bevorzuge ich viel [].

+4

Das Subskript ist Zucker für 'objectForKeyedSubscript:', nicht 'objectForKey:' direkt. (Auch '@ []' ist ein Literal 'NSArray', kein Index: Entferne das' @ '.) –

+0

@JoshCaswell Ja, sicherlich ohne das (kopierte) '@'. Führt es letztendlich nicht zu "objectForKey:"? Oder hat die'objectForKeyedSubscript: 'Indirection einige Nebenwirkungen? – Eiko

+0

Korrekt, auf 'NSDictionary', es ruft gerade gerade zu' objectForKey: '. –

2

ist, dass in einem Kontext haben Lassen:

Es gibt verschiedene Möglichkeiten, auf ein Objekt zuzugreifen, die von einem Schlüssel zugänglich ist.

A. Schlüsselwert Coding

Key-Wert Codierung mit -valueForKey: et al getan. Da dies in NSObject implementiert ist, antworten fast alle Objekte mit Eigenschaften (Eigenschaften, auf die der Schlüssel zugreifen kann). Im Grunde bildet diese Methode einen Selektor aus dem Schlüssel und sendet ihn an das Objekt. Außerdem haben Sie die Möglichkeit, einen Schlüsselpfad zu erstellen, und es gibt einige spezielle Schlüssel, d. e. Anzahl.

Dies ist vollständig außerhalb des Compilers implementiert.

Instanzen von NSDictionary unterstützt dies.

B. Subskribierung

[] ist die Syntax für Subskribierung. Wenn der Schlüssel zwischen [ und ] ein Objekt ist, handelt es sich um eine Schlüssel-Subskription. Der Compiler wandelt diese Syntax in eine -objectForKeyedSubscript: et al. Um. Botschaft. Der Empfänger muss die Methoden implementieren.

Instanzen von NSDictionary unterstützt dies durch einfaches Senden -objectForKey: et al. zu self. Aber es gibt einen kleinen Unterschied, siehe unten.

C. NSDictionary

Zusätzlich NSDictionary implementiert -objectForKey:.

Es gibt kein richtig oder falsch. Persönlich würde ich die spezifischste Nachricht für Instanzen von NSDictionary, -objectForKey: et al bevorzugen. Schlüssellaufwerk ist jedoch möglicherweise besser lesbar.

Schlüssel-Wert-Codierung ist gut, wenn Sie den Typ des Empfängers nicht kennen.

BTW: Key-Wert-Codierung und Keyed-Subscripting lassen Sie Null-Werte in einer Instanz von NSMutableDictionary, während -setObject:forKey: et al. verbietet das.

Verwandte Themen