Сравнение литералов 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 не создается.

NSNumber также имеет isEqualToNumber:

Другие вопросы по тегам