Сравнение литералов NSNumber
Мне действительно нравятся новые литералы в Objective-C. Мне интересно, если с новыми дополнениями есть лучший способ сравнить цифры.
Например, если я хочу сравнить a
а также b
:
a = @1;
b = @2;
Это единственный способ сравнить их так:
[a intValue] > [b intValue]
Или есть лучшие, более элегантные решения?
4 ответа
Для проверки равенства вы можете использовать isEqualToNumber
который проверяет, является ли id
или содержание равно (с последним использованием compare
):
if ([a isEqualToNumber:b]) // if a == b
Не уверен, почему они также не реализовали isGreaterThanNumber
а также isLessThanNumber
удобные методы (и, возможно, >=
а также <=
а), так как compare
метод ниже кажется немного неуклюжим.
Для проверки неравенства, просто используйте compare
напрямую (вы также можете сделать это для равенства, как видно из первого ниже):
if ([a compare:b] == NSOrderedSame) // if (a == b)
if ([a compare:b] == NSOrderedAscending) // if (a < b)
if ([a compare:b] == NSOrderedDescending) // if (a > b)
if ([a compare:b] != NSOrderedSame) // if (a != b)
if ([a compare:b] != NSOrderedAscending) // if (a >= b)
if ([a compare:b] != NSOrderedSescending) // if (a <= b)
Подробности можно найти на странице документации класса NSNumber.
Имейте в виду, что ничто не мешает вам создать собственную вспомогательную функцию, которая, например, разрешает такой код:
if (nsnComp1 (a, ">=", b)) ... // returns true/false (yes/no)
или же:
if (nsnComp2 (a, b) >= 0) ... // returns -1/0/+1
несмотря на то, что это меньше Objective-C и больше C:-) Это зависит от того, связано ли ваше определение "элегантного" в основном с эффективностью или удобочитаемостью. Является ли это предпочтительным для вашего intValue
Вариант - это решение, которое вам нужно принять самостоятельно.
NSNumber
инвентарь -compare:
(как и ряд других классов). Так что можете сказать
switch ([a compare:b]) {
case NSOrderedAscending: // a < b
// blah blah
break;
case NSOrderedSame: // a == b
// blah blah
break;
case NSOrderedDescending: // a > b
// blah blah
break;
}
Вот фрагмент кода для проверки, который работает хорошо:
NSLog(@"%d", number1 == number2);
NSLog(@"%d", [number1 isEqual:number2]);
NSLog(@"%d", [number1 isEqualToNumber:number2]);
Выход:
1
1
1
Заключение:
Чтобы понять сравнение, вам нужно понять распределение экземпляров. NSNumber внутренне реализует кэш назначенных объектов и сопоставляет существующие объекты с любыми вновь созданными объектами, используя значения. Если найден существующий объект NSNumber со значением 1, новый экземпляр NSNumber не создается.