Если вы просто сортируете массив NSNumbers
, вы можете отсортировать их одним вызовом:
[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]];
Я склонен предпочитать простые операторы и множество временных переменных, потому что код легче читать и легче отлаживать. В любом случае компилятор оптимизирует временные переменные, поэтому нет преимущества перед версией «все в одной строке».