Can you fast enumerate a NSIndexSet
? if not, what's the best way to enumerate the items in the set?
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.
NSIndexSet
fast enumeration ought to be pretty fast. –
Batfish 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];
}
int
, since indexes are unsigned. Further, when targeting a 64-bit platform or building with NS_BUILD_32_LIKE_64
defined, the index is a 64-bit value. Use NSUInteger
instead of int
in order to match the type stored by NSIndexSet
under all platforms. –
Schaub NSInteger
because the "not found" return value is NSNotFound
which is the same as NSIntegerMax
–
Bessiebessy NSNotFound
not -1. –
Bessiebessy -indexGreaterThanIndex:
does return NSNotFound, not -1. The issue in the discussion occurs because he like you was using the wrong return type. –
Bessiebessy NSNotFound
halves the range of index values NSUInteger
could represent if NSNotFound
were instead NSUIntegerMax
. I suppose NSNotFound
is NSIntegerMax
so as to agree with kCFNotFound
; the CFIndex
type used by CF collections is a signed long. @EveryoneElse Even with indices capped at NSNotFound
(NSIntegerMax
), int
is still the wrong choice to store an index, because the range of NSInteger
exceeds the range of int
in 64-bit builds and builds with NS_BUILD_32_LIKE_64
defined. –
Schaub 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.
NSIndexSet
fast enumeration ought to be pretty fast. –
Batfish 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.
}
© 2022 - 2024 — McMap. All rights reserved.