¿Diferencia entre objectForKey y valueForKey?


¿Cuál es la diferencia entre objectForKey y valueForKey? Busqué ambos en la documentación y me parecieron lo mismo.

Author: James Webster, 2009-06-30

4 answers

objectForKey: es un método NSDictionary. Un NSDictionary es una clase de colección similar a un NSArray, excepto que en lugar de usar índices, usa claves para diferenciar entre elementos. Una clave es una cadena arbitraria que usted proporciona. No hay dos objetos que puedan tener la misma clave (al igual que no hay dos objetos en un NSArray pueden tener el mismo índice).

valueForKey: es un método KVC. Funciona con CUALQUIER clase. valueForKey: le permite acceder a una propiedad usando una cadena para su nombre. Así, por ejemplo, si tengo una clase Account con una propiedad accountNumber, puedo hacer lo siguiente:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setAccountNumber:anAccountNUmber];

NSNumber *anotherAccountNumber = [newAccount accountNumber];

Usando KVC, puedo acceder a la propiedad dinámicamente:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];

[newAccount setValue:anAccountNumber forKey:@"accountNumber"];

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];

Esos son conjuntos equivalentes de declaraciones.

Sé que estás pensando: wow, pero sarcásticamente. KVC no parece tan útil. De hecho, parece "prolijo". Pero cuando quieres cambiar las cosas en tiempo de ejecución, puedes hacer muchas cosas interesantes que son mucho más difíciles en otros idiomas (pero esto está más allá del alcance de tu pregunta).

Si quieres saber más acerca de KVC, hay muchos tutoriales si Google especialmente en blog de Scott Stevenson . También puede consultar la Referencia del Protocolo NSKeyValueCoding.

Espero que eso ayude.

 394
Author: Corey Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-28 13:00:41

Cuando haces valueForKey: necesitas darle una NSString, mientras que objectForKey: puede tomar cualquier subclase NSObject como clave. Esto se debe a que para la codificación Clave-Valor, las claves son siempre cadenas.

De hecho, la documentación indica que incluso cuando se da valueForKey: un NSString, invocará objectForKey: de todos modos a menos que la cadena comience con un @, en cuyo caso invoca [super valueForKey:], que puede llamar valueForUndefinedKey: que puede generar una excepción.

 63
Author: dreamlax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-30 08:25:43

Aquí hay una gran razón para usar objectForKey: siempre que sea posible en lugar de valueForKey: - valueForKey: con una clave desconocida lanzará NSUnknownKeyException diciendo "esta clase no es compatible con la codificación del valor de la clave ".

 21
Author: Nick Locking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-30 19:19:26

Como se ha dicho, el tipo de datos objectForKey: es :(id)aKey mientras que el tipo de datos valueForKey: es :(NSString *)key.

Por ejemplo:

 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];

 NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);  
    //This will work fine and prints (    123    )  

 NSLog(@"valueForKey  : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); 
    //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'"   ---- This will crash on runtime. 

Entonces, valueForKey: tomará solo un valor de cadena y es un método KVC, mientras que objectForKey: tomará cualquier tipo de objeto.

El valor en objectForKey será accedido por el mismo tipo de objeto.

 12
Author: Harjot Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-16 21:34:34