すばやく列挙できますNSIndexSet
か?そうでない場合、セット内のアイテムを列挙するための最良の方法は何ですか?
6 に答える
OSX10.6以降およびiOSSDK4.0以降では、次の-enumerateIndexesUsingBlock:
メッセージを使用できます。
NSIndexSet *idxSet = ...
[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
//... do something with idx
// *stop = YES; to stop iteration early
}];
whileループでうまくいくはずです。前のインデックスを使用した後、インデックスをインクリメントします。
/*int (as commented, unreliable across different platforms)*/
NSUInteger currentIndex = [someIndexSet firstIndex];
while (currentIndex != NSNotFound)
{
//use the currentIndex
//increment
currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
高速列挙はオブジェクトを生成する必要があります。NSIndexSetにNSUInteger
はオブジェクトではなくスカラー数(s)が含まれているため、いいえ、インデックスセットを高速に列挙することはできません。
仮に、それらをNSNumbersにボックス化することはできますが、それほど高速ではありません。
簡単な答え:いいえ。 プロトコルNSIndexSet
に準拠していません。<NSFastEnumeration>
インスタンスがあるとするとNSTableView
(それを呼びましょう)、以下を使用して、データソース(ええと..)*tableView
から複数の選択された行を削除できます。*myMutableArrayDataSource
[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];
[tableView selectedRowIndexes]
を返しますNSIndexSet
。自分でインデックスの列挙を開始する必要はありませんNSIndexSet
。
これらの答えは、Swift5のIndexSetには当てはまりません。あなたは完全に次のようなものを手に入れることができます:
let selectedRows:IndexSet = table.selectedRowIndexes
次に、次のようにインデックスを列挙します。
for index in selectedRows {
// your code here.
}