你能快速枚举NSIndexSet
吗?如果没有,枚举集合中项目的最佳方法是什么?
答案 0 :(得分:145)
在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
}];
答案 1 :(得分:22)
while循环应该可以解决问题。使用上一个索引后,它会递增索引。
/*int (as commented, unreliable across different platforms)*/
NSUInteger currentIndex = [someIndexSet firstIndex];
while (currentIndex != NSNotFound)
{
//use the currentIndex
//increment
currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
答案 2 :(得分:20)
快速枚举必须产生对象;由于NSIndexSet包含标量数(NSUInteger
s),而不包含对象,否则不能快速枚举索引集。
假设它可以将它们装入NSNumbers,但那时它不会很快。
答案 3 :(得分:10)
简答:不。 NSIndexSet
不符合<NSFastEnumeration>
protocol。
答案 4 :(得分:2)
假设您有一个NSTableView
实例(我们称之为*tableView
),您可以使用以下命令从数据源(uhm .. *myMutableArrayDataSource
)删除多个选定的行:
[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];
[tableView selectedRowIndexes]
会返回NSIndexSet
。
无需自己开始枚举NSIndexSet
中的索引。
答案 5 :(得分:0)
对于 Swift 5 中的IndexSet,这些答案不再成立。您可以完美地得到类似的东西:
let selectedRows:IndexSet = table.selectedRowIndexes
然后枚举如下索引:
for index in selectedRows {
// your code here.
}