Можете ли вы быстро перечислить 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.
}