Можете ли вы быстро перечислить NSIndexSet? если нет, то какой лучший способ перечислить элементы в наборе?
Быстрое перечисление на NSIndexSet
Ответ 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.
}