objective-c - studio - html spec
Comparando NSNumbers en Objective C (4)
Asumo que número1 y número2 son punteros a objetos. El signo <está comparando los punteros.
Debe comparar el valor real de floatValue o doubleValue
if ([number1 doubleValue] < [number2 doubleValue])
....
Soy un principiante en Obj-C y estoy un poco confundido en este escenario, tengo el siguiente código:
if (number1 < number2) {
NSLog(@"THE FOLLOWING NUMBER ");
NSLog(@"%@", number1);
NSLog(@"IS LESS THAN");
NSLog(@"%@", number2);
}
Cuando ejecuto este código veo resultados realmente extraños como este:
2011-07-06 20:38:18.044 helloworld[1014:207] THE FOLLOWING NUMBER
2011-07-06 20:38:18.047 helloworld[1014:207] 190.8776
2011-07-06 20:38:18.050 helloworld[1014:207] IS LESS THAN
2011-07-06 20:38:18.053 helloworld[1014:207] 96.75866
Ambos números son objetos NSNumber, ¿cómo podría suceder algo como esto? Estoy obteniendo los dos números al encontrar distancias entre los sprites en la pantalla.
Cualquier pista o consejo sería realmente apreciado.
NSNumber tiene un método de comparación: - (NSComparisonResult) compare: (NSNumber *) aNumber
if([numberOne compare:numberTwo] == NSOrderedSame)
{
// proceed
}
Para los casos en los que simplemente desea probar si dos propiedades NSNumber tienen el mismo valor , entonces de la documentación de Apple parece que al usar
- (BOOL)isEqualToNumber:(NSNumber *)aNumber
es la forma más sencilla y eficiente de comparar dos valores de NSNumber.
Por ejemplo:
if ([someNumber isEqualToNumber:someOtherNumber])
{
// The numbers hold the same value
}
else
{
// The numbers hold different values
}
La documentación también dice "Este método es más eficiente que comparar: si sabes que los dos objetos son números".
Siempre que necesite saber si un valor es menor o mayor, le ofrecen
- (NSComparisonResult)compare:(NSNumber *)aNumber
método, pero personalmente preferiría en ese punto simplemente extraer los valores enteros (o valores dobles) y usar operadores <y> regulares para hacer la comparación, porque eso hace que el código sea mucho más fácil de leer, así:
if (firstNumber.intValue > secondNumber.intValue)
{
// First number is greater than the second number
}
else if (firstNumber.intValue == secondNumber.intValue)
{
// The two numbers have the same value
}
else
{
// The first number is smaller than the second number
}
Algo así es mucho más fácil de leer que las llamadas a -compare :, en mi opinión.
Erik
Swift 3.1
let number1 = NSNumber(value: 10.2)
let number2 = NSNumber(value: 20.2)
let result = number1.compare(number2)
if result == .orderedAscending {
} else if result == .orderedDescending {
} else { // .orderedSame
}