6

高速列挙を使用しているときに、配列の最後のオブジェクトに到達したことを知るための最良の方法は何ですか?intをインクリメントしてから、それを配列の長さと比較するよりも良い方法はありますか?

4

5 に答える 5

15

配列から始める場合は、最後の要素を取得し(そのための特定の呼び出しがあります)、列挙子で取得した各要素をそれと比較します。何かのようなもの:

id lastEl = [myArray lastObject];

for ( id anEl in myArray )
{
   if ( anEl == lastEl )
     .....  // do the last thing
}

比較コストはカウンターと同じですが、カウンターをインクリメントするコストや、カウンターをインクリメントするのを忘れたときに必ず発生する間違いはありません。

于 2010-12-27T22:17:14.103 に答える
2

通常、高速列挙とは、カウンターを使用していないことを意味します...

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html

他の形式はカウンターなしです...

NSEnumerator *enumerator = [objectSet objectEnumerator];
id setObject;
while ((setObject = [enumerator nextObject]) != nil)
{
    ...
}
于 2010-12-27T22:13:41.063 に答える
1

ここでパフォーマンステストに責任がある場合、高速列挙とブロック列挙の間にパフォーマンスの違いはあまりありません。または、bbumはここで、「ブロックベースの列挙により、コレクションクラスは、ネイティブストレージ形式の最速のトラバーサルと同じ速さでコンテンツを列挙できます」と述べています。

次に、ブロック列挙を使用して、インデックスとオブジェクトを同時に取得し、比較できるようにすることをお勧めします。

于 2014-12-30T02:07:54.237 に答える
0

これを行う(単純な)方法はないと思います。これは、高速列挙を使用することのトレードオフの1つです。そのため、列挙しているアイテムのインデックスを認識する必要がある場合は、提案どおりに整数を作成する必要があります。

とはいえ、高速列挙子などを使用すると、範囲外に出ることはできないという事実から、引き続きメリットが得られます。

于 2010-12-27T22:11:50.543 に答える
0

ブロックで列挙を使用することもできます。

[myArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    BOOL isLastObject = idx == [myArray count]-1;
    if (isLastObject){
        //...
    }
}];

配列に含まれるオブジェクトの種類がわかっている場合はid、適切なクラスに置き換えることをお勧めします。

于 2016-04-25T17:01:12.190 に答える