2010-03-11 22 views
12

¿Existe una mejor manera de comparar un NSNumber con un valor fijo, simplemente se siente un poco torpe.comparar un NSNumber con un valor fijo?

if([myNumber isEqualToNumber:[NSNumber numberWithInt:0]]) NSLog(@"Zero"); 

Yo sé que puedo usar -compare pero más o menos tiene el mismo aspecto ...

Gary

+2

Todo en Obj-C se siente un poco torpe por un tiempo . – MJeffryes

+2

Usando literales, no es tan malo: '[NSNumber isEqualToNumber: @ 0]' –

Respuesta

49

¿Qué tal if ([myNumber intValue] == 0)? (o < o>, obviamente).

+0

Doh :) perfecto, muchas gracias Ben ... – fuzzygoat

+7

Me gustaría señalar que esto solo funciona si se sabe que el número es un número entero. el intValue de un NSNumber con el valor 0.4 será 0. –

5

NSNumber objetos pueden contener enteros, flotador, dobles, etc. enfoque de Ben (en comparación con un NSNumber 's intValue) es muy rápido y fácil de leer, pero sólo funciona correctamente si se puede garantizar que myNumber es siempre en el rango de int (y siempre lo será, incluso después de cambios en el código futuro).

Por esta razón, su enfoque es realmente superior si no conoce el tipo exacto de myNumber.

// This will work regardless if myNumber is an int, double etc. 
[myNumber isEqualToNumber:[NSNumber numberWithInt:0]] 

Si se compara con números fijos o flotadores más grandes, tendrá que seguir esta ruta de todos modos. Además, las versiones recientes de Xcode adecuadamente advertirle si se intenta crear un NSNumber con el tipo equivocado, que puede ayudar a detectar problemas temprano:

Xcode 6.1.3 implicit conversion warning NSNumber

+1

Otra fuente sutil de error sería la subclase 'NSDecimalNumber' que puede producir resultados incorrectos a partir de' intValue'. +1 –

Cuestiones relacionadas