47

你能快速列举一个NSIndexSet吗?如果没有,枚举集合中项目的最佳方法是什么?

4

6 回答 6

146

在 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
}];
于 2010-11-17T21:20:53.830 回答
22

一个while循环应该可以解决问题。使用前一个索引后,它会增加索引。

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

    //increment
    currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
于 2010-11-17T20:54:10.773 回答
20

快速枚举必须产生对象;由于 NSIndexSet 包含标量数字(NSUIntegers),而不是对象,不,您不能快速枚举索引集。

假设它可以将它们打包成 NSNumbers,但它不会很快。

于 2010-11-19T05:49:02.523 回答
10

简短的回答:没有。 NSIndexSet不符合<NSFastEnumeration>协议

于 2010-11-17T21:22:46.273 回答
2

假设您有一个NSTableView实例(我们称之为*tableView),您可以从数据源中删除多个选定的行(嗯.. *myMutableArrayDataSource),使用:

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

[tableView selectedRowIndexes]返回一个NSIndexSet. 无需开始枚举您NSIndexSet自己的索引。

于 2013-12-05T12:53:58.420 回答
1

这些答案对于Swift 5中的 IndexSet 不再适用。你可以完美地得到类似的东西:

let selectedRows:IndexSet = table.selectedRowIndexes

然后像这样枚举索引:

for index in selectedRows {
   // your code here.
}
于 2019-07-08T22:08:16.967 回答