Я предполагаю, что вы используете NSMutableArray, потому что NSArray является неизменным.
Когда вы сортируете что-то, вы хотите, чтобы конечный результат был упорядочен как
x1 <= x2 <= x3 <= x4 <= ... <= xN
Как определить это <=
? В ObjC есть 3 решения.
1. -sortUsingSelector:
[arr sortUsingSelector:@selector(foo:)]
означает, что его элементы будут сравниваться как *
x <= y is equivalent to [x foo:y] <= 0
Например, для сортировки списка строк без учета регистра вы используете [arr sortUsingSelector:@selector(caseInsensitiveCompare:)]
.
2. -sortUsingFunction:context:
Это похоже на -sortUsingSelector:
, но в качестве ввода используется указатель на функцию. [arr sortUsingFunction:funcptr context:ctx]
означает, что его элементы будут сравниваться как
x <= y is equivalent to funcptr(x, y, ctx) <= 0
3. -sortUsingDescriptors:
Это самый сложный. Он принимает список NSSortDescriptors, которые описывают ожидаемый порядок свойств. Один базовый пример:
NSSortDescriptor* desc = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
[arr sortUsingDescriptors:[NSArray arrayWithObject:desc]];
[desc release];
дескриптор сообщает программе сортировки «сортировать по ключу distance
в порядке возрастания».
Предположим, есть 2 ключа, целые числа x
, затем возрастающие и строки y
, убывающие, тогда вы можете написать
NSSortDescriptor* dx = [[NSSortDescriptor alloc] initWithKey:@"x" ascending:YES];
NSSortDescriptor* dy = [[NSSortDescriptor alloc] initWithKey:@"y" ascending:NO selector:@selector(caseInsensitiveCompare:)];
[arr sortUsingDescriptors:[NSArray arrayWithObjects:x, y, nil]];
[dx release];
[dy release];
и т. Д.
Примечание: * На самом деле вы должны возвращать только -1, 0 или 1.