2012-07-11 21 views
6

Qual è la differenza tra forKey e forKeyPath nel metodo setValue di NSMutableDicitionary? Ho cercato entrambi nella documentazione e mi sono sembrati uguali. Ho provato a seguire il codice, ma non ho potuto distinguere la differenza.Objective-C: Qual è la differenza tra forKey e forKeyPath?

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
[dict setValue:@"abc" forKey:@"ABC"]; 
[dict setValue:@"123" forKeyPath:@"xyz"]; 
for (NSString* key in dict) { 
    id val = [dict objectForKey:key]; 
    NSLog(@"%@, %@", key, val); 
} 
+2

Solo diverso se si utilizza un dizionario più complesso (con più livelli). La ragione per cui la tua sembra la stessa è che un keypath con una sola cosa (no '.' che indica un componente aggiuntivo del percorso) è in realtà solo una chiave. – Dustin

risposta

7

Entrambi i metodi sono parte di Key-Value Coding e non dovrebbero generalmente essere utilizzato per accedere elemento nei dizionari. Funzionano solo con i tasti di tipo NSString e richiedono una sintassi specifica.

La differenza tra entrambi è che la specifica di una (singola) chiave dovrebbe solo cercare quell'elemento.

Specificare un percorso di chiave d'altra parte segue il percorso attraverso gli oggetti. Se disponi di un dizionario di dizionari, puoi cercare un elemento nel secondo livello utilizzando un percorso chiave come "key1.key2".

Se si desidera accedere agli elementi di un dizionario, è necessario utilizzare objectForKey: e setObject:forKey:.

Modifica di rispondere perché non dovrebbe essere utilizzato valueForKey::

  1. valueForKey: funziona solo per le chiavi di stringa. I dizionari possono usare altri oggetti per le chiavi.
  2. valueForKey: Gestisce le chiavi che iniziano con un carattere "@" in modo diverso. Non è possibile accedere agli elementi le cui chiavi iniziano con @.
  3. Soprattutto: utilizzando valueForKey: stai dicendo: "Sto usando KVC". Ci dovrebbe essere una ragione per farlo. Quando si utilizza objectForKey: si sta solo accedendo a elementi in un dizionario attraverso l'API naturale e desiderata.
+0

Solo per curiosità, qual è la ragione per cui 'valueForKey:' non dovrebbe essere usato con i dizionari? – Monolo

+0

@Monolo Vedi modifica. –

3

di Apple Documentazione: NSKeyValueCoding Protocol Reference

setValue: Forkey:

imposta la proprietà del ricevitore specificato da una data chiave per un dato valore.

Esempio:

[foo setValue:@"blah blah" forKey:@"stringOnFoo"]; 

setValue: forKeyPath:

Imposta il valore della proprietà identificata da un percorso determinato chiave per un dato valore.

Esempio:

[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"]; 
+1

Inoltre, quando si utilizza "setValue: forKeyPath:" assicurarsi che l'oggetto su keyPath esista. Se è nullo, il metodo fallirà silenziosamente perché il percorso è incompleto. – ezekielDFM

1

keyPath può essere utilizzato per attraversare percorsi oggetto arbitrari, purché implementino NSKeyValueCoding. Non è necessario che siano NSDictionary s. Ad esempio:

NSString *departmentName = [self valueForKeyPath:@"[person.department.name"]; 

Anche se questo è un esempio un po 'forzato.

Problemi correlati