Сравнение NSNumbers в Objective C

Я новичок в Obj-C, и я немного запутался в этом сценарии, у меня есть следующий код:

if (number1 < number2) {

            NSLog(@"THE FOLLOWING NUMBER ");
            NSLog(@"%@", number1);
            NSLog(@"IS LESS THAN");
            NSLog(@"%@", number2);

}

когда я запускаю этот код, я вижу очень странные результаты:

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

оба числа являются объектами NSNumber, как может произойти что-то подобное? Я получаю два числа, находя расстояния между спрайтами на экране.

любые подсказки или советы будут очень цениться

4 ответов


Я предполагаю, что number1 и number2 являются указателями на объекты. Знак

вам нужно сравнить фактическое значение floatValue или doubleValue

if ([number1 doubleValue] < [number2 doubleValue]) 

....


для случаев, когда вы просто хотите проверить, содержат ли два свойства NSNumber то же значение, то из документации Apple кажется, что с помощью

- (BOOL)isEqualToNumber:(NSNumber *)aNumber

является наиболее простым и эффективным способом сравнения двух значений NSNumber.

например:

if ([someNumber isEqualToNumber:someOtherNumber])
{
    // The numbers hold the same value
}
else
{
    // The numbers hold different values
}

в документации также говорится: "Этот метод более эффективен, чем сравнение: если вы знаете, что два объекта являются числами."

всякий раз, когда вам нужно знать независимо от того, является ли значение меньше или больше, они предлагают

- (NSComparisonResult)compare:(NSNumber *)aNumber

метод, но лично я предпочел бы в этот момент просто вытащить целочисленные значения (или двойные значения) и использовать регулярные операторы для сравнения, потому что это упрощает чтение кода, например:

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
}

что-то вроде этого гораздо легче читать, чем вызовы-сравнить:, на мой взгляд.

Ерик


NSNumber имеет метод для сравнения: - (NSComparisonResult)сравнить: (NSNumber*)aNumber

if([numberOne compare:numberTwo] == NSOrderedSame) 
{
      // proceed
}

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

}