Подтвердить что ты не робот

Сравнение 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, как могло произойти что-то подобное? Я получаю два числа, находя расстояние между спрайтами на экране.

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

4b9b3361

Ответ 1

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

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

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

....

Ответ 2

В случаях, когда вы просто хотите проверить, имеют ли два свойства 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:, на мой взгляд.

Эрик

Ответ 3

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

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

Ответ 4

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

}