1

for ループで複数の値を使用しようとしていました。2 つの個別の for ループを作成すると、コードが 2 回繰り返されるので、これを試しました。

for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){

でもダメ!!どうすればできますか??

4

5 に答える 5

3

NSDictionaryこのための特別なブロックベースの方法を提供します。

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];
于 2012-05-12T12:42:01.960 に答える
1

まず、変数名は小文字で始める必要があります。

for ループの「通常の」形式を知っていますか? 使用しているものは、これの単なるショートカットです。

for (int i = 0; i < [myArray count]; i++) {
    id obj = [myArray objectAtIndex:i];
    // do something with the object
}

だからあなたの場合、あなたは書くことができます

NSArray *allKeys = [dictionary allKeys];
for (int i = 0; i < [allKeys count]; i++) {
    NSString *key = [allKeys objectAtIndex:i];
    NSObject *obj = [dictionary objectForKey:key];
    // do something 
}
于 2012-05-12T12:39:58.373 に答える
1

for-in ループはこのようには機能しません。プロトコルを実装するオブジェクトを 1 つ取りNSFastEnumeration、すべての値をループします。それ以下でもそれ以上でもありません。ループ内でキーと値を使用する必要がある場合は、キーの値を取得する必要があります。

for (id key in dictionary) {
   id value = [dictionary valueForKey: key];
   // do stuff with key and value
}

を列挙する必要はないことに注意してください。キーを列挙するため[dictionary allKeys]NSDictionary実装NSFastEnumerationします。

自分で値のルックアップを行いたくない場合で、ブロックが利用可能な OS (iOS 4.0 および Mac OS X 10.6 以降) を対象とする場合は、ブロックベースの方法を使用できますenumerateKeysAndObjectsUsingBlock:

[dictionary enumerateKeysAndObjectsUsingBlock:^( id key, id value, BOOL *stop ) {
    // do stuff with key and value
}];

ブロックベースのメソッドを使用すると、通常のループで使用できる一方で、ループ*stopからYES抜け出すように設定できます。break

于 2012-05-12T12:47:59.537 に答える
0

コンテンツを反復処理する前に、2 つの配列を連結する必要があります。

NSMutableArray *allKeysAndValues = [NSMutableArray arrayWithArray:[Dictionary allKeys]];
[allKeysAndValues addObjectsFromArray:[Dictionary allValues]];
for (NSString* KeyOrValue in allKeysAndValues) {
    // Do something...
}

より良いアプローチは、次のようにblockを使用して辞書を列挙することです。

[Dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
于 2012-05-12T12:40:16.183 に答える
0

私はあなたがそれを行うことができるとは思わない. 行を見るだけで、コンパイラのセマンティックの問題があります。これは、Key と Key2 を同時に並行して繰り返すことを意味しますか? 両方のキーが非 nil の場合にのみループに入ることを意味しますか? 2 つのセットを連結して繰り返すということですか? 等...

あなたの Dictionary は、あなたがやりたいことに適したデータ構造ではないかもしれません。

これはあなたがやろうとしていることでうまくいきませんか?

for (NSString* Key in [Dictionary allKeys]) {
    NSString* Key2 = [Dictionary objectForKey:Key]?
    // ...
}

または、両方のセットを単一の配列に連結し、それが必要な場合は反復することもできます。

于 2012-05-12T12:41:25.287 に答える