开发者

Fast enumeration on an NSIndexSet

Can you fast enumerate a 开发者_如何转开发NSIndexSet? if not, what's the best way to enumerate the items in the set?


In OS X 10.6+ and iOS SDK 4.0+, you can use the -enumerateIndexesUsingBlock: message:

NSIndexSet *idxSet = ...

[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
  //... do something with idx
  // *stop = YES; to stop iteration early
}];


A while loop should do the trick. It increments the index after you use the previous index.

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

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


Fast enumeration must yield objects; since an NSIndexSet contains scalar numbers (NSUIntegers), not objects, no, you cannot fast-enumerate an index set.

Hypothetically, it could box them up into NSNumbers, but then it wouldn't be very fast.


Short answer: no. NSIndexSet does not conform to the <NSFastEnumeration> protocol.


Supposing you have an NSTableView instance (let's call it *tableView), you can delete multiple selected rows from the datasource (uhm.. *myMutableArrayDataSource), using:

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

[tableView selectedRowIndexes] returns an NSIndexSet. No need to start enumerating over the indexes in the NSIndexSet yourself.


These answers are no longer true for IndexSet in Swift 5. You can perfectly get something like:

let selectedRows:IndexSet = table.selectedRowIndexes

and then enumerate the indices like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜