Создавая и Используя дескрипторы вида
Дескриптор вида описывает сравнение, используемое для сортировки набора объектов. Вы создаете экземпляр 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.
Можно добавить, что поддержка сравнения их классам путем реализации совместимого сравнивает метод, как описано в Требованиях Объектов коллекции.
Требования объектов коллекции
Для набора, чтобы быть в состоянии сортировать его использование содержания NSSortDescriptor
, объекты должны соответствовать следующим ожиданиям.
Каждый объект в наборе должен быть значением ключа, совместимым кодированием для ключа свойства, используемого для создания дескриптора вида (для больше о кодировании значения ключа, посмотрите, что Значение ключа Кодирует Руководство по программированию).
Объект в указанном ключе свойства, относительно каждого объекта в наборе, должен реализовать сравнить селектор, используемый для создания дескриптора вида. Если бы никакой пользовательский селектор не был указан, то объекты должны реализовать
compare:
.Селектор, используемый для сравнения, передается единственный параметр, объект выдержать сравнение с
self
, и должен возвратить надлежащееNSComparisonResult
.
Попытка сортировать набор, содержащий объекты, приводящие любое к сбою из этих требований, повысит исключение.