问题
Can you fast enumerate a NSIndexSet
? if not, what's the best way to enumerate the items in the set?
回答1:
Fast enumeration must yield objects; since an NSIndexSet contains scalar numbers (NSUInteger
s), 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.
回答2:
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
}];
回答3:
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];
}
回答4:
Short answer: no. NSIndexSet
does not conform to the <NSFastEnumeration> protocol.
回答5:
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.
回答6:
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.
}
来源:https://stackoverflow.com/questions/4209029/fast-enumeration-on-an-nsindexset