2012-02-11 6 views
12

Я все еще новичок в объективе-c, и я пытаюсь понять, что именно делает это утверждение.sortedArrayUsingSelector, что он делает?

[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

Я знаю, что allKeys получает все ключи от моего словаря. Я знаю, что sortedArrayUsingSelector сортирует мой массив im, создавая. Тогда я называю метод сравнения, то есть где я потерял то, что это делает? Из документа на яблоке говорится, что «Возвращает значение NSComparisonResult, которое указывает, больше ли приемник, равный или меньше заданного числа». Я не понимаю, как он сортируется на основе этого метода.

ответ

22
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 

Приведенный выше код возвращает отсортированный массив ключей словаря, используя предоставленный вами селектор. Селектор фактически является функцией, которая будет вызываться на объекте, который сортируется в вашем массиве. В этом случае ваш массив содержит строки, так и в реальной NSArray сортировки коды следующей будет происходить,

//... 
[key1 compare:key2]; 
//.. 

Если вы прошли в другом селекторе позволяет сказать @selector (randomFunction :) затем в сортировочном коде следующий будет происшествие

//.. 
[key1 randomFunction:key2]; 
//.. 

Поскольку NSString не отвечает на селектор randomFunction, вы получите сообщение об ошибке. Если вы хотите создать свой собственный тип функции сравнения, вам нужно добавить категорию к классу, который содержит массив (в вашем случае категория - NSString).

Лучшим способом сортировки массива является использование оператора блока.

id mySort = ^(NSString * key1, NSString * key2){ 
    return [key1 compare:key2]; 
}; 


NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort]; 

Причина, по которой это лучший способ, заключается в сортировке любых объектов очень легко.

id mySort = ^(MyObject * obj1, MyObject * obj2){ 
    return [obj1.title compare:obj2.title]; 
}; 


NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort]; 
+0

+1 - хорошее объяснение – bryanmac

5
- (NSComparisonResult)compare: 
{ 
    // if (value of firstObject) < (value of secondObject) 
     // return NSOrderedAscending 
    // else if (value of firstObject) == (value of secondObject) 
     // return NSOrderedSame 
    // else 
     // return NSOrderedDescending 
} 
0

Вы, вероятно, следует использовать caseInsensitiveCompare: в этой ситуации, так как вы, скорее всего, заказав массив строк (ключей из словаря).

Вы предположили, что sortedArrayUsingSelector каким-то образом отделен от части кода compare:. Это не тот случай. compare:- селектор, который используется для сортировки массива.

Метод сортировки возвращает массив, в котором каждый элемент при отправке указанного селектора и следующего элемента в массиве дает правильный порядок сортировки.

Как NSArray достигает этого, он не является общедоступным, но в корне, выбранный вами селектор используется для сравнения пар объектов из массива, результат которого сообщает их размещение в отсортированном массиве.

3

-sortedArrayUsingSelector: метод в вашем примере вызывает -compare: метод на объекты в массиве. Для некоторых объектов Apple уже внедрила метод -compare:, например, если вы прочитали the NSString documentation, вы найдете метод -compare:. Вы также можете вызвать пользовательские методы сравнения на своих собственных объектах, если вы реализовали метод сравнения в этих объектах. Обратите внимание, что метод сравнения не должен называться -compare:, значение имеет только возвращаемое значение (NSComparisonResult) и объект, который получает метод.

0

Новый массив содержит ссылки на элементы принимающего массива, а не их копии.
Сообщение компаратора отправляется каждому объекту в массиве и имеет в качестве единственного аргумента другой объект в массиве.
Например, массив объектов NSString можно отсортировать с помощью метода caseInsensitiveCompare:, объявленного в классе NSString. Предполагая, что существует anArray, сортированная версия массива может быть создана следующим образом:

NSArray *sortedArray = 
    [anArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
Смежные вопросы