Создавая и Используя дескрипторы вида

Дескриптор вида описывает сравнение, используемое для сортировки набора объектов. Вы создаете экземпляр NSSortDescriptor это указывает ключ свойства, который будет сортирован, и должно ли сравнение быть в возрастании или порядке по убыванию. Дескриптор вида может также указать метод для использования при сравнении значений ключа свойства, а не значения по умолчанию compare:.

Важно помнить это NSSortDescriptor не сортирует объекты. Это предоставляет описание того, как сортировать объекты. Фактическая сортировка сделана другими классами, часто NSArray или NSMutableArray.

Указание видов Используя NSSortDescriptor

Давайте примем как пример, что у нас есть массив (экземпляр NSArray) содержа экземпляры пользовательского класса, Employee (который удовлетворяет требования, определенные в Требованиях Объектов коллекции). Employee класс имеет атрибуты для имени и фамилии сотрудника (экземпляры NSString), дата, найма (экземпляр NSDate), и возраст (экземпляр NSNumber).

Наша первая задача состоит в том, чтобы возвратиться NSArray объект сортировал использование возраста. Пример в Перечислении 1 иллюстрирует, как создать NSSortDescriptor это может использоваться для сортировки содержания массива в порядке возрастания age ключ.

Перечисление 1  , Сортирующее массив ключом возраста

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

Вы отметите, что при сортировке массива было необходимо обеспечить массив NSSortDescriptor экземпляры. Каждый из дескрипторов вида применяется в последовательности, обеспечивая средние значения сортировки на многократных ключах свойства.

Если мы также хотели сортировать датой, найма, мы можем добавить другой дескриптор к массиву, для которого мы обеспечиваем sortedArrayUsingDescriptors:. Пример в Перечислении 2 демонстрирует использующие многократные дескрипторы вида виду на возрасте, и затем сотрудников вида того же возраста их датой, найма.

Перечисление 2  , Сортирующее массив возрастом и датой, арендных ключей

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSSortDescriptor *hireDateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"hireDate" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor, hireDateDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

В каждом из этих случаев, метода сравнения по умолчанию, compare:, используется. При сортировке возрастом (где значения возраста являются экземплярами NSNumber), compare: метод, реализованный NSNumber используется; при сортировке датой, найма (где дата, арендных значений экземпляры NSDate), compare: метод, реализованный NSDate используется.

Если мы хотим сортировать сотрудников по имени, однако, так как имена являются строками, результаты должны быть упорядочены в алфавитном порядке согласно локали пользователя, и возможно без чувствительности к регистру. Значение по умолчанию compare: метод NSString не делает этого, таким образом, мы должны указать пользовательский метод выполнить сравнение.

Указание пользовательских сравнений

Предыдущие примеры все полагаются на значение по умолчанию compare: метод к виду возрастом и датой, найма. Имена являются строками, и когда Вы сортируете строки для представления пользователю, необходимо всегда использовать локализованное сравнение (см. Поиск, Сравнение и Сортировку Строк в Строковом Руководстве по программированию). Часто Вы также хотите выполнить нечувствительное к регистру сравнение. Пример в Перечислении 3 показывает, как указать подходящий метод сравнения (localizedStandardCompare:) упорядочивать массив фамилией и именем.

Перечисление 3  , Сортирующее массив с помощью локализованного стандартного сравнения

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [peopleArray sortedArrayUsingDescriptors:sortDescriptors];

Фундаментальные классы, имеющие методы, которые могут использоваться с дескрипторами вида, перечислены в Таблице 1.

Таблица 1  Общие Фундаментальные классы и методы сравнения

Метод сравнения

Поддержка классов

compare:

NSString, NSMutableString, NSDate, NSCalendarDate, NSValue (только скалярные типы и символ без знака), NSNumber

caseInsensitiveCompare:

NSString, NSMutableString

localizedCompare:

NSString, NSMutableString

localizedCaseInsensitiveCompare:

NSString, NSMutableString

localizedStandardCompare:

NSString, NSMutableString

Можно добавить, что поддержка сравнения их классам путем реализации совместимого сравнивает метод, как описано в Требованиях Объектов коллекции.

Требования объектов коллекции

Для набора, чтобы быть в состоянии сортировать его использование содержания NSSortDescriptor, объекты должны соответствовать следующим ожиданиям.

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