4

高速列挙の使い方は知っていると思いましたが、わからないことがあります。NSString3つのオブジェクトと3つのオブジェクトを作成NSNumberし、それらをNSMutableArray:に配置するとします。

NSString *str1 = @"str1";
NSString *str2 = @"str2";
NSString *str3 = @"str3";

NSNumber *nb1 = [NSNumber numberWithInt:1];
NSNumber *nb2 = [NSNumber numberWithInt:2];
NSNumber *nb3 = [NSNumber numberWithInt:3];

NSArray *array = [[NSArray alloc] initWithObjects:str1, str2, str3, nb1, nb2, nb3, nil];

NSString次に、次のように、すべてのオブジェクトで高速列挙を実行します。

for (NSString *str in array) {
    NSLog(@"str : %@", str);
}

コンソールでは、次の結果が得られます:

2011-08-02 13:53:12.873 FastEnumeration[14172:b603] str : str1
2011-08-02 13:53:12.874 FastEnumeration[14172:b603] str : str2
2011-08-02 13:53:12.875 FastEnumeration[14172:b603] str : str3
2011-08-02 13:53:12.875 FastEnumeration[14172:b603] str : 1
2011-08-02 13:53:12.876 FastEnumeration[14172:b603] str : 2
2011-08-02 13:53:12.876 FastEnumeration[14172:b603] str : 3

sのみをログに記録NSStringしましたが、配列内のすべてのオブジェクトの行を取得します。sも含めて、NSNumber理由がわかりません。高速列挙は常に配列に含まれるすべてのオブジェクトを使用しますか?

4

8 に答える 8

10

そのような forin ループを記述すると、配列内のすべてのオブジェクトが NSString としてキャストされ、要求に応じて出力されます。

NSString のみが必要な場合は、次のように記述する必要があります。

for (id obj in array) {
    if ([obj isKindOfClass:[NSString class]]) {
        NSLog(@"str: %@", obj);
    }
}
于 2011-08-02T21:13:09.003 に答える
8

for allループは NSString と Integers の違いを認識しません。単純に配列全体を調べ、それぞれを NSString としてキャストし、要求どおりに出力します。

于 2011-08-02T21:10:42.190 に答える
7

高速な列挙が配列内のすべてのオブジェクトを返すと確信しています。あなたがしているのfor (NSString *str in array)strNSString. ループの本体では、返されたオブジェクトのクラスをチェックして、それがNSString.

for(NSString *str in array)
{
    if([str isKindOfClass:[NSString class]])
        NSLog(@"str : %@", str);
}
于 2011-08-02T21:12:51.897 に答える
1

NSObject から派生するすべてのオブジェクトは、メソッド - (NSString)description を実装します。Objective-C フォーマット文字列の %@ は、%@ に対応する引数を取り、その説明メソッドを呼び出します。NSObject のほとんどのサブクラスは、独自のバージョンの - ( NSString) 説明。入力しても同じことが起こります

> po anObject

デバッガーで。

于 2011-08-03T07:13:58.720 に答える
1

Objective-C は動的に型付けされます。つまり、実行時 (ループが実際に実行されるとき) には、オブジェクトはすべて事実上id、異なるクラスを持つ 1 つの型 ( ) になります。この言語ではオプションのコンパイル時の静的型付けが許可されていますが、それは、送信しているメッセージがマークした型に対して有効かどうかを確認するだけです。実際にプログラムの動作を変更するわけではありません。オブジェクトを実際とは異なる型にキャストすると、コンパイラに嘘をつき、その型チェッカーを無効にするだけです。

于 2011-08-02T21:18:40.447 に答える
1
for (NSString *str in array) {

配列内のすべての要素を列挙する方法です。

指定することでそのタイプのオブジェクトのみを取得すると期待するNSStringのは正しくありません。むしろ、すべてのオブジェクト ポインターがその型 ( NSString*) にキャストされます。

The Objective-C Programming Language ガイドのFast Enumerationをご覧ください。

于 2011-08-02T21:10:53.017 に答える
0

高速列挙では、型キャストはなく、ポインターを新しいオブジェクトに割り当てるだけです

于 2013-02-05T08:27:03.810 に答える
0

予期しない動作がどこにあるのかわかりません。拡張された for ループを使用するNSMutableArrayと、配列内のすべてのオブジェクトが繰り返されます。この場合は 6 であり、結果は正しく、期待されます。

数値は文字列にキャストされるだけです。

于 2011-08-02T21:10:42.520 に答える