web-dev-qa-db-ja.com

NSIndexSetの高速列挙

NSIndexSetを高速に列挙できますか?そうでない場合、セット内のアイテムを列挙する最良の方法は何ですか?

47
cfischer

高速列挙はオブジェクトを生成する必要があります。 NSIndexSetにはオブジェクトではなくスカラー数(NSUIntegers)が含まれているため、いいえ、インデックスセットを高速に列挙することはできません。

仮に、それらをNSNumbersにボックス化することはできますが、それほど高速ではありません。

20
Peter Hosey

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
}];
145
Barry Wark

Whileループでうまくいくはずです。前のインデックスを使用した後、インデックスを増分します。

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

    //increment
    currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
22
Evan Mulawski

短い答え:いいえ。 NSIndexSet<NSFastEnumeration>プロトコル

10
Dave DeLong

NSTableViewインスタンスがあるとします(これを*tableView)、データソースから選択した複数の行を削除できます(ええと... *myMutableArrayDataSource)、使用:

[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];

[tableView selectedRowIndexes]NSIndexSetを返します。 NSIndexSetのインデックスを自分で列挙し始める必要はありません。

2
Fnord23

これらの答えはSwift 5のIndexSetには当てはまりません。あなたは完全に次のようなものを得ることができます:

let selectedRows:IndexSet = table.selectedRowIndexes

次に、このようなインデックスを列挙します。

for index in selectedRows {
   // your code here.
}
0
jvarela