Сортировка массива NSIndexPaths
У меня есть NSMutableArray
, содержащий объекты NSIndexPath
, и я хотел бы отсортировать их по их row
в порядке возрастания.
Какой самый короткий или простой способ сделать это?
Вот что я пробовал:
[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSIndexPath *indexPath1 = obj1;
NSIndexPath *indexPath2 = obj2;
return [@(indexPath1.section) compare:@(indexPath2.section)];
}];
Ответы
Ответ 1
Вы сказали, что хотите сортировать по row
, но вы сравниваете section
. Кроме того, section
- NSInteger
, поэтому вы не можете вызывать методы на нем.
Измените свой код следующим образом, чтобы отсортировать по row
:
[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSInteger r1 = [obj1 row];
NSInteger r2 = [obj2 row];
if (r1 > r2) {
return (NSComparisonResult)NSOrderedDescending;
}
if (r1 < r2) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
Ответ 2
Вы также можете использовать NSSortDescriptors для сортировки NSIndexPath с помощью свойства 'row'.
если self.selectedIndexPath
не изменяется:
NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
NSArray *sortedRows = [self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];
или если self.selectedIndexPath
является NSMutableArray
, просто:
NSSortDescriptor *rowDescriptor = [[NSSortDescriptor alloc] initWithKey:@"row" ascending:YES];
[self.selectedIndexPaths sortedArrayUsingDescriptors:@[rowDescriptor]];
Простой и короткий.
Ответ 3
Для изменяемого массива:
[self.selectedIndexPaths sortUsingSelector:@selector(compare:)];
Для неизменяемого массива:
NSArray *sortedArray = [self.selectedIndexPaths sortedArrayUsingSelector:@selector(compare:)]
Ответ 4
В быстрой:
let paths = tableView.indexPathsForSelectedRows() as [NSIndexPath]
let sortedArray = paths.sorted {$0.row < $1.row}