Функция сравнения - это ваш способ сообщить алгоритму сортировки, как вы хотите, чтобы ваши объекты упорядочивались. Без него невозможно узнать, каким должен быть окончательный порядок.
В вашем примере кода имена аргументов num1
и num2
вводят в заблуждение. Они были бы более точно названы object1
и object2
. Если object1
должно предшествовать object2
, верните NSOrderedAscending
. Если это должно последовать, то NSOrderedDescending
в противном случае верните NSOrderedSame
.
Для иллюстрации приведем пример, который сортирует гипотетические Person
объекты по возрасту (от низшего к высшему).
NSInteger youngest_first(id object1, id object2, void *context) {
if (object1.age < object2.age) {
return NSOrderedAscending;
}
else if (object1.age > object2.age) {
return NSOrderedDescending;
}
else {
return NSOrderedSame;
}
}
Обратите внимание, что я даже не использовал параметр context, поскольку мои объекты сами имели достаточно информации для определения порядка.
Если вместо этого я хочу, чтобы они сортировались по убыванию, я мог бы передать следующее:
NSInteger tallest_first(id object1, id object2, void *context) {
if (object1.height > object2.height) {
return NSOrderedAscending;
}
else if (object1.height < object2.height) {
return NSOrderedDescending;
}
else {
return NSOrderedSame;
}
}
Одна вещь, которая очень важна , заключается в том, что ваша функция должна возвращать согласованный результат, если аргументы передаются в другом порядке. Например, если tallest_first(adam, joe, NULL)
возвращает NSOrderedDescending
, тогда tallest_first(joe, adam, NULL)
должно вернуть NSOrderedAscending
. Если нет, то ваша функция сравнения противоречит сама себе.