2012-07-11 16 views
6

¿Cuál es la diferencia entre forKey y forKeyPath en el método setValue de NSMutableDicitionary? Los miré a ambos en la documentación y me parecieron iguales. Intenté seguir el código, pero no pude distinguir la diferencia.Objetivo-C: ¿Cuál es la diferencia entre forKey y 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 diferente si usa un diccionario más complejo (con varios niveles). La razón por la que tuyo tiene el mismo aspecto es que un keypath con solo una cosa (no '.' indica un componente de ruta adicional) es solo una clave. – Dustin

Respuesta

7

Ambos métodos son parte de Key-Value Coding y no deben en general ser utilizados para el acceso elemento en los diccionarios. Solo funcionan en las claves del tipo NSString y requieren una sintaxis específica.

La diferencia entre ambos es que especificar una tecla (simple) simplemente buscaría ese elemento.

La especificación de una ruta de acceso de tecla sigue la ruta a través de los objetos. Si tuviera un diccionario de diccionarios, podría buscar un elemento en el segundo nivel utilizando una ruta clave como "key1.key2".

Si solo desea acceder a elementos en un diccionario, debe usar objectForKey: y setObject:forKey:.

Editar de responder por qué valueForKey: no debe usarse:

  1. valueForKey: sólo funciona para las claves de cadena. Los diccionarios pueden usar otros objetos para las claves.
  2. valueForKey: Maneja las teclas que comienzan con el carácter "@" de manera diferente. No puede acceder a los elementos cuyas claves comienzan con @.
  3. Lo más importante: Al usar valueForKey: está diciendo: "Estoy usando KVC". Debería haber una razón para hacer esto. Cuando usa objectForKey:, solo está accediendo a elementos en un diccionario a través de la API natural prevista.
+0

Solo por curiosidad, ¿cuál es el motivo por el que 'valueForKey:' no debería usarse con diccionarios? – Monolo

+0

@Monolo Ver edición. –

3

de Apple Documentación: NSKeyValueCoding Protocol Reference

setValue: forKey:

establece la propiedad del receptor especificado por una clave dada a un valor dado.

Ejemplo:

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

setValue: forKeyPath:

establece el valor para la propiedad identificada por una ruta de clave dado a un valor dado.

Ejemplo:

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

Además, al usar "setValue: forKeyPath:" asegúrese de que el objeto en keyPath exista. Si es nulo, el método fallará silenciosamente porque la ruta está incompleta. – ezekielDFM

1

keyPath se puede utilizar para recorrer rutas de objetos arbitrarias, siempre que implementen NSKeyValueCoding. No necesitan ser NSDictionary s. Por ejemplo:

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

Aunque este es un pequeño ejemplo inventado.

Cuestiones relacionadas