Сравнение 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
}