Быстрое перечисление по NSIndexSet

Можете ли вы быстро перечислить NSIndexSet? если нет, как лучше всего перечислить элементы в наборе?

5 ответов

Решение

Быстрое перечисление должно давать объекты; так как NSIndexSet содержит скалярные числа (NSUIntegers), а не объекты, нет, вы не можете быстро перечислить набор индексов.

Гипотетически, это может объединить их в NSNumbers, но тогда это будет не очень быстро.

В OS X 10.6+ и iOS SDK 4.0+ вы можете использовать -enumerateIndexesUsingBlock: сообщение:

NSIndexSet *idxSet = ...

[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  //... do something with idx
  // *stop = YES; to stop iteration early
}];

Цикл while должен помочь. Он увеличивает индекс после использования предыдущего индекса.

/*int (as commented, unreliable across different platforms)*/
NSUInteger currentIndex = [someIndexSet firstIndex];
while (currentIndex != NSNotFound)
{
    //use the currentIndex

    //increment
    currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}

Краткий ответ: нет. NSIndexSet не соответствует <NSFastEnumeration> протокол

Предположим, у вас есть NSTableView экземпляр (давайте назовем это *tableView), вы можете удалить несколько выбранных строк из источника данных (хм.. *myMutableArrayDataSource), с помощью:

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

[tableView selectedRowIndexes] возвращает NSIndexSet, Не нужно начинать перечисление по индексам в NSIndexSet сам.

Эти ответы больше не верны для IndexSet в Swift 5. Отлично может получиться что-то вроде:

let selectedRows:IndexSet = table.selectedRowIndexes

а затем перечислить индексы следующим образом:

for index in selectedRows {
   // your code here.
}
Другие вопросы по тегам