-3

与えられた配列

NSArray *myArray = @[@"hello", @5, @[@6, @7, @8]];
for (NSNumber *myNumber in myArray)
{
   NSLog (@"%@", myNumber);
}

ログ メッセージの出力は 5 または 5 6 7 8 になります。for/in ループは、ディクショナリ/配列の最上位オブジェクトをイントロスペクトしますか、それともネストされたセット、配列、ディクショナリなどを深く調べますか?

編集

私はこの質問に多くの熱意を持っていることに気付いたので、私が何を得ていたのかを明確にさせてください. はい、大丈夫です。 for-in 高速列挙はイントロスペクションを実行しませんが、なぜですか? NSNumber や NSString などの型を具体的に指定している場合、for in ループは、オブジェクトを間違った型としてキャストするのではなく、指定した型で kindOfClass メソッドを実行しないのはなぜですか? 上記の例では、配列内の NSNumbers のみを反復処理するのは直感的ではありませんか?

答えは、配列内の各項目に対してイントロスペクションを実行していると思われますが、高速列挙のパフォーマンス向上を無効にする可能性がありますか? しかし、動的型付けが必要な場合は id を使用し、イントロスペクションを実行したい場合は明示的な型を使用して、これを解決できないでしょうか?

4

1 に答える 1

3

あなたのコードは以下を生成します:

 "hello"
 5
 (6, 7, 8)

いくつかのコメント...

1)forループは、列挙しているオブジェクトの1つのレベルのみを列挙するため、レベルを下げません。

2) ループ変数が正しい型であることを確認するように注意する必要があります。あなたのすべての要素NSArrayNSNumber. に固有のメッセージを送信しようとするとNSNumber、実行時エラーが発生します。

%@3) withを使用すると、配列のすべての要素によって実装されるオブジェクトにメッセージがNSLog送信されるため、コードはクラッシュしません。descriptionあなたの例では、配列内のすべてが実際myNumberに.idNSNumber

于 2014-02-11T04:10:18.383 に答える