tiene sonido solo mal llaman hablo escucha desactivado cuando bocina auriculares altavoz iphone objective-c cocoa-touch nsnumber

iphone - sonido - compruebe si NSNumber está vacío



mi iphone no tiene sonido cuando me llaman (5)

¿Cómo verifico si un objeto NSNumber es nulo o está vacío?

OK nil es fácil:

NSNumber *myNumber; if (myNumber == nil) doSomething

Pero si el objeto se ha creado, pero no tiene ningún valor porque una asignación ha fallado, ¿cómo puedo verificar esto? Usa algo como esto?

if ([myNumber intValue]==0) doSomething

¿Hay un método general para probar objetos en vacío como para NSString disponible (ver este post )?

Ejemplo 1

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setValue:@"" forKey:@"emptyValue"]; NSNumber *emptyNumber = [dict objectForKey:@"emptyValue"];

¿Qué valor contiene emptyNumber ? ¿Cómo puedo verificar si el emptyNumber vacío está vacío?

Ejemplo 2

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setValue:@"" forKey:@"emptyValue"]; NSString *myString = [dict objectForKey:@"emptyValue"]; if (myString == nil || [myString length] == 0) // got an empty value NSNumber *emptyNumber=nil;

¿Qué sucede si uso esto después de que emptyNumber se haya establecido en nil?

[emptyNumber intValue]

¿Tengo cero?

Ejemplo 3

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setValue:@"" forKey:@"emptyValue"]; NSNumber *myEmptyValue = [dict objectForKey:@"emptyValue"]; if (myEmptyValue == nil) // NSLog is never called NSLog(@"It is empty!");

De esta manera nunca se llama NSLog. myEmptyValue no es nil y no NSNull . ¿Así que contiene un número arbitrario?


Es muy común (al menos para mí) sacar un objeto de un diccionario, esperar que sea un número NS y luego devolverle un objeto nulo. Si esto sucede y haces un intValue, se bloqueará.

Lo que hago es configurar la protección nula porque prefiero obtener un valor predeterminado que un bloqueo.

Una forma es:

-(int) intForDictionary:(NSDictionary *)thisDict objectForKey: (NSString *)thisKey withDefault: (int)defaultValue { NSNumber *thisNumber = [thisDict objectForKey:thisKey]; if (thisNumber == nil) { return defaultValue; } return [thisNumber intValue]; }

Y tengo uno igual para flotadores. Entonces al menos obtienes tu valor predeterminado. Otra forma es simplemente crear un método para protección nula.

-(NSNumber *)nilProtectionForNumber: (NSNumber *)thisNumber withDefault: (NSNumber *)defaultNumber { if (thisNumber) { return thisNumber; } else return defaultNumber; }

Ese que llamarías así:

NSNumber *value = [self nilProtectionForNumber:[dict objectForKey:keyThatShouldBeNSNumber] withDefault:[NSNumber numberWithInt:0]];


Se supone que NSValue , NSNumber , ... se crean a partir de un valor y siempre se mantienen uno. La prueba para un valor específico como 0 solo funciona si no está en el rango de valores válidos con los que está trabajando.

En el caso poco frecuente de que sea más sencillo trabajar con el código si tiene un valor que representa "no válido" o "no establecido" y no puede usar nil (por ejemplo, con los contenedores estándar), puede usar NSNull en NSNull lugar.

En tu primer ejemplo esto podría ser:

[dict setValue:[NSNull null] forKey:@"emptyValue"]; if ([dict objectForKey:@"emptyValue"] == [NSNull null]) { // ... }

Pero tenga en cuenta que simplemente no puede insertar (o eliminar) ese valor a menos que necesite diferenciar nil (es decir, no en el contenedor) y, por ejemplo, "no válido" :

if ([dict objectForKey:@"nonExistent"] == nil) { // ... }

En cuanto al segundo ejemplo , -intValue le da 0 , pero simplemente porque enviar mensajes a nil devuelve 0 . También puede obtener 0 por ejemplo, para un NSNumber cuyo valor intValue se estableció en 0 antes, lo que podría ser un valor válido.
Como ya escribí anteriormente, solo puedes hacer algo como esto si 0 no es un valor válido para ti . Tenga en cuenta que para usted , lo que funciona mejor depende completamente de cuáles son sus requisitos.

Déjame intentar resumir :

Opción 1:

Si no necesita todos los valores del rango de números, puede usar uno ( 0 o -1 o ...) e -intValue / ... para representar específicamente "vacío" . Aparentemente este no es el caso para ti.

Opcion 2:

Simplemente no almacena ni elimina los valores del contenedor si están "vacíos" :

// add if not empty: [dict setObject:someNumber forKey:someKey]; // remove if empty: [dict removeObjectForKey:someKey]; // retrieve number: NSNumber *num = [dict objectForKey:someKey]; if (num == nil) { // ... wasn''t in dictionary, which represents empty } else { // ... not empty }

Sin embargo, esto significa que no hay diferencia entre las claves que están vacías y las que nunca existen o son ilegales.

Opción # 3:

En algunos casos raros, es más conveniente mantener todas las claves en el diccionario y representar "vacío" con un valor diferente. Si no puede usar uno del rango numérico, tenemos que colocar algo de manera diferente, ya que NSNumber no tiene un concepto de "vacío" . Cocoa ya tiene NSNull para tales casos:

// set to number if not empty: [dict setObject:someNumber forKey:someKey]; // set to NSNull if empty: [dict setObject:[NSNull null] forKey:someKey]; // retrieve number: id obj = [dict objectForKey:someKey]; if (obj == [NSNumber null]) { // ... empty } else { // ... not empty NSNumber *num = obj; // ... }

Esta opción ahora le permite diferenciar entre "vacío" , "no vacío" y "no en el contenedor" (por ejemplo, clave ilegal).


Tratando con Swift 2.0 y Parse:

var myNumber = yourArray!.objectForKey("yourColumnTitle") if (myNumber == nil) { myNumber = 0 }

En mi caso, entonces tuve que:

let myNumberIntValue = myNumber!.intValue


NSNumber es nil , o contiene un número, nada en el medio. "Vacío" es una noción que depende de la semántica del objeto en particular y, por lo tanto, no tiene sentido buscar un control de vacío general.

En cuanto a sus ejemplos, hay varias cosas que suceden:

NSMutableDictionary *hash = [NSMutableDictionary dictionary]; [hash setObject:@"" forKey:@"key"]; NSNumber *number = [hash objectForKey:@"key"]; NSLog(@"%i", [number intValue]);

El NSLog imprimirá 0 aquí, pero solo porque hay un método NSString en NSString . Si cambia el mensaje a algo que solo NSNumber puede hacer, el código fallará:

NSLog(@"%i", [number unsignedIntValue]);

Esto lanzará:

-[NSCFString unsignedIntValue]: unrecognized selector sent to instance 0x303c

Lo que significa que no está obteniendo algún valor "vacío" general de la función hash, simplemente obtiene el NSString que almacenó allí.

Cuando tenga un NSNumber vacío ( == nil ) y le envíe un mensaje, el resultado será cero. Eso es simplemente una convención de lenguaje que simplifica el código:

(array != nil && [array count] == 0) (someNumber == nil ? 0 : [someNumber intValue])

Se convertirá en esto:

([array count] == 0) ([someNumber intValue])

Espero que esto ayude.


NSNumber s son inmutables y solo se pueden crear con un método de fábrica o con un método inicial que les dé algún valor numérico. Por lo que sé, no es posible terminar con un NSNumber ''vacío'', a menos que cuente 0.