web-dev-qa-db-ja.com

NSArrayを逆方向に反復する簡単な方法はありますか?

私はNSArrayを取得しており、特別なケースでは逆方向に反復処理する必要があるため、最初の最後の要素を確認します。これはパフォーマンス上の理由によるものです。最後のものが意味をなさない場合は、以前のすべてを無視できます。だから私はループを壊したいと思います。しかし、0からnまで順方向に反復すると、それは機能しません。 nから0に移動する必要があります。おそらく、知らないメソッドまたは関数があるため、ここでホイールを再発明する必要はありません。

66
Thanks

他の回答を追加するには、-[NSArray reverseObjectEnumerator] Objective-C 2.0の高速列挙機能と組み合わせて(iPhone、Leopardで利用可能):

for (id someObject in [myArray reverseObjectEnumerator])
{
    // print some info
    NSLog([someObject description]);
}

いくつかの詳細情報のあるソース: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

188
Sijmen Mulder

これはパフォーマンスのためのものなので、いくつかのオプションがあり、どれが最も効果的かを確認するためにそれらすべてを試すことをお勧めします。

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • 配列の逆のコピーを作成 し、それを通常通り繰り返します
  • 標準のCのforループを使用して開始し、配列を逆方向に処理します。

より極端な方法(パフォーマンスが非常に重要な場合)

  • Cocoaが高速オブジェクト列挙をどのように実装するかを読み、逆に独自の等価物を作成します。
  • CまたはC++配列を使用します。

他にもあるかもしれません。その場合、どなたでも自由に追加していただけます。

17
Mike Abdullah

ここ から:

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }
12
Naaff
[NsArray reverseObjectEnumerator]
2
CiNN
for (int i = ((int)[array count] - 1); i > -1; i--) {
    NSLog(@"element: %@",array[i]);
}
0