iphone ios nsdictionary null

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ón

Este método agrega valor y clave al diccionario usando setObject:forKey: menos que el valor sea nil en cuyo caso el método intenta eliminar la clave usando removeObjectForKey:

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.