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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

В 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
}];

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

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

Ответ 6

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

let selectedRows:IndexSet = table.selectedRowIndexes

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

for index in selectedRows {
   // your code here.
}