2

この質問が非常に単純である場合は申し訳ありませんが、私は狂ったようにグーグルで検索しましたが、これが何であるかについての適切な説明を見つけることができません.

for (id line in self.lines){
    [linesCopy addObject:[line copyWithZone:zone]];
}

私は Objective-C を学んでいますが、これはfor今まで見たことのない形式のループです。シンプルに慣れてきた

for (int x = 1, x < 10, x++)

forループのスタイル。

4

4 に答える 4

11

Cocoa Core Competenciesから: 列挙:

高速列挙

コレクション クラスを含むいくつかの Cocoa クラスは、このNSFastEnumerationプロトコルを採用しています。次の例に示すように、標準の C の for ループと同様の構文を使用して、インスタンスが保持する要素を取得するために使用します。

NSArray *anArray = // get an array;
for (id element in anArray) {
    /* code that acts on the element */
}

名前が示すように、高速列挙は他の形式の列挙よりも効率的です。

ご存じない場合idは、Objective-C 型であり、基本的に「任意の Objective-C オブジェクトへのポインター」を意味します。のポインター性idが組み込まれていることに注意してください。あなたは通常言いたくないid *

anArrayの要素が特定のクラス、たとえば であると予想される場合MyObjectは、代わりにそれを使用できます。

for (MyObject *element in anArray) {
    /* code that acts on the element */
}

ただし、コンパイラもランタイムも、要素が実際に のインスタンスであることを確認しませんMyObject。の要素が のインスタンスでない場合、anArray理解できないMyObjectメッセージを送信しようとしてしまい、セレクタが認識されない例外が発生する可能性があります。

于 2013-05-23T22:49:37.097 に答える
1

これはforinループと呼ばれ、高速列挙とも呼ばれます。基本的に、構文は次のとおりです。

for (SomeObjectIAmExpecting *localVariableName in anArrayOfObjects)
{
    if (![localVariableName isKindOfClass:[SomeObjectIAmExpecting class]]) continue; //To avoid errors.
     //do something to them
}
于 2013-05-23T22:48:06.997 に答える
1

これは、この一般的な形式の簡略版です。

for (int i = 0; i < [self.lines count]; i++) {
    id line = [self.lines objectAtIndex:i];
    // ...
}

これは非常に一般的なループ イディオム (コレクション、配列、セットなどを一度に 1 つずつ処理すること) であるため、「高速列挙」と呼ばれるこのような省略形に変換されています。

実際、内部実装では、実際には自分で実行するよりもわずかに高速であるため、明快さとパフォーマンスの両方の点で望ましいです。

于 2013-05-23T22:49:32.657 に答える
1

NSFastEnumerationこれは、プロトコルに準拠するクラスで使用できるステートメントです。これが利用可能になったら、Objective-C プログラミング ガイドで使用することをお勧めします。ここを見てください。for (int i = 0; i < length; ++i)これは、従来の構文を使用せずにコレクションを反復処理する方法です。

通常、この方法で反復しながら要素の削除と挿入をサポートしていないことに注意してください (また、通常のforループを使用する場合は、いずれにしてもインデックスに注意する必要があります)。

基本的に、すべての標準コレクションがこの反復方法をサポートしています。

于 2013-05-23T22:50:10.523 に答える