iphone - iOS: ¿Por qué no puedo establecer nil a valor de NSDictionary?
null (5)
Esta podría ser una pregunta muy básica, pero me preguntaba por qué no puedo asignar nil como valor NSDictionary? Tengo siguiente declaración de muchos lugares en mi código. Si [q objectForKey:@"text"]
es nil, la aplicación se cuelga.
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
Tengo que verificar en todas partes el nil antes de asignarlo al diccionario. ¿Es esta la única forma correcta de hacerlo? ¿Me estoy perdiendo algo obvio?
if([q objectForKey:@"text"] != nil)
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
[dict setObject:@"" forKey:@"text"];
Quiere un objeto real ... use NSNull
Puede establecer un valor nil usando setValue:forKey
pero elimina la clave.
Si desea poder establecer una clave en nil
, podría usar setValue:forKey:
que eliminará la clave si la establece en nil
(cita de la documentación a continuación). Tenga en cuenta el valor en lugar de objeto.
setValue:forKey:
Agrega un par clave-valor dado al diccionario.
...
DiscusiónEste método agrega valor y clave al diccionario usando
setObject:forKey:
menos que el valor seanil
en cuyo caso el método intenta eliminar la clave usandoremoveObjectForKey:
Cuando más tarde intente obtener el objeto usando objectForKey:
para la clave que eliminó estableciéndola en nil
obtendrá nil
back (cita de la documentación a continuación).
Valor de retorno:El valor asociado con aKey, o nil si no hay ningún valor asociado con aKey.
Nota: la clave no estará presente en el diccionario, por lo que no se obtendrá utilizando todas las allKeys
; o ser enumerado más.
Mi amigo que usa nil como marcador es un signo de mala programación. nil está reservado para un propósito diferente.
if([q objectForKey:@"text"] != nil) [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; else [dict removeObjectforKey:@"text"]; // this will do nothing if key does not exsist.
// de forma predeterminada para todas las claves, el valor es nulo y está intentando anular este comportamiento. ir contra las reglas del lenguaje siempre te meterá en problemas.
para comprobar simplemente el uso
if([dict objectforKey:@"text"] !=nil){} // this will work becuase default value is nil itself
Puede establecer un objeto nil de esta manera:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
dictionary[@“key”] = nil;
¿Lo has notado?
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
/* this statement is safe to execute */
dictionary[@“key”] = nil;
/* but this statement will crash application */
[dictionary setObject:nil forKey:@"key"];
Al usar este método:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
Parámetros (de acuerdo con los documentos de Apple ):
un Objeto :
Levanta una invalidArgumentException si anObject es nulo. Si necesita representar un valor nulo en el diccionario, use NSNull.
una llave
Levanta una invalidArgumentException si aKey es nil.