Якщо ви просто сортуєте масив NSNumbers
, ви можете сортувати їх за допомогою 1 дзвінка:
[arrayToSort sortUsingSelector: @selector(compare:)];
Це працює, тому що об'єкти в масиві ( NSNumber
об'єкти) реалізують метод порівняння. Ви можете зробити те самеNSString
об’єктів або навіть для масиву спеціальних об'єктів даних, які реалізують метод порівняння.
Ось кілька прикладів коду за допомогою блоків порівняння. Він сортує масив словників, де кожен словник включає номер у ключі "sort_key".
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
if (value1 > value2)
{
return (NSComparisonResult)NSOrderedDescending;
}
if (value1 < value2)
{
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Код, описаний вище, проходить через отримання цілого значення для кожного ключа сортування та порівняння їх, як ілюстрацію того, як це зробити. Оскільки NSNumber
об'єкти реалізують метод порівняння, його можна переписати набагато простіше:
#define SORT_KEY @\"sort_key\"
[anArray sortUsingComparator:
^(id obj1, id obj2)
{
NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
return [key1 compare: key2];
}];
або корпус компаратора може бути навіть відведений до 1 рядка:
return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];
Я, як правило, віддаю перевагу простим операторам і безлічі тимчасових змінних, оскільки код легше читати і простіше налагоджувати. Компілятор все одно оптимізує тимчасові змінні, тому переваги універсальній версії "все в одному" немає переваги.