Подтвердить что ты не робот

Сортировка массива NSIndexPaths

У меня есть NSMutableArray, содержащий объекты NSIndexPath, и я хотел бы отсортировать их по их row в порядке возрастания.

Какой самый короткий или простой способ сделать это?

Вот что я пробовал:

[self.selectedIndexPaths sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSIndexPath *indexPath1 = obj1;
    NSIndexPath *indexPath2 = obj2;
    return [@(indexPath1.section) compare:@(indexPath2.section)];
}];
4b9b3361

Ответ 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}