Быстрое перечисление по NSIndexSet - PullRequest
46 голосов
/ 17 ноября 2010

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

Ответы [ 6 ]

145 голосов
/ 18 ноября 2010

В 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
}];
22 голосов
/ 17 ноября 2010

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

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

    //increment
    currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
20 голосов
/ 19 ноября 2010

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

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

10 голосов
/ 18 ноября 2010

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

2 голосов
/ 05 декабря 2013

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

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

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

0 голосов
/ 09 июля 2019

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

let selectedRows:IndexSet = table.selectedRowIndexes

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

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