Быстрое перечисление по NSIndexSet
Можете ли вы быстро перечислить NSIndexSet
? если нет, как лучше всего перечислить элементы в наборе?
5 ответов
Быстрое перечисление должно давать объекты; так как NSIndexSet содержит скалярные числа (NSUInteger
s), а не объекты, нет, вы не можете быстро перечислить набор индексов.
Гипотетически, это может объединить их в 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.
}