NSIndexSet上的快速枚举

时间:2010-11-17 20:51:00

标签: cocoa macos nsindexset

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

6 个答案:

答案 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.
}