Сравнение NSNumbers в Задаче C - PullRequest
61 голосов
/ 07 июля 2011

Я новичок в 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 ]

105 голосов
/ 07 июля 2011

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

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

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

....

38 голосов
/ 23 января 2014

Для случаев, когда вы просто хотите проверить, содержат ли два свойства 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
}

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

Эрик

16 голосов
/ 07 ноября 2013

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

if([numberOne compare:numberTwo] == NSOrderedSame) 
{
      // proceed
}
0 голосов
/ 11 мая 2017

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

}
...