2012-05-12 14 views
1

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

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

まったくありません!!私はどうすればいいのですか?

答えて

1

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

forループの「通常の」形式を知っていますか?

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

だからあなたの場合には、あなたはあなたがそれらの内容を反復処理前に2つの配列を連結する必要が

NSArray *allKeys = [dictionary allKeys]; 
for (int i = 0; i < [allKeys count]; i++) { 
    NSString *key = [allKeys objectAtIndex:i]; 
    NSObject *obj = [dictionary objectForKey:key]; 
    // do something 
} 
0

書くことができます:あなたが使用しているものは、このためだけの近道です

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

より良いアプローチは、このように、ブロックであなたの辞書を列挙することになります。

[Dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { 
    NSLog(@"%@ = %@", key, object); 
}]; 
+0

Downvoter、手入れを凝らすには? – dasblinkenlight

+0

+1を軽減する。 – CodaFi

0

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

あなたの辞書は、あなたのやりたいことのための正しいデータ構造ではないかもしれません。

あなたがしようとしているものではうまくいかないでしょうか?

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

または、両方のセットを1つの配列に連結して、それが望ましい動作であるかどうかを繰り返してみることができます。

3

NSDictionaryこのための特別なブロックベースの方法であって:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    // do something with key and obj 
}]; 
+0

これを追加しようとしましたが、動作しませんでした。それはあなたに何を許すのですか?私が今持っている主な問題は、データが順番に表示されず、混在していることです。これで問題は解決しますか? – Alessandro

+0

もちろんソートされていません。辞書のキーは、定義によって定義されていない順序を持っています。キーをソートしたい場合は、 'allKeys'で配列を取得し、その配列をソートしてください。次に、他の答えのいくつかが示すように、配列を繰り返し処理します。 –

1

のためのインループは次のように動作しません。 NSFastEnumerationプロトコルを実装し、すべての値にループをかけるオブジェクトは1つだけで、それ以上のものはありません。 NSDictionaryが終わっ列挙するNSFastEnumerationを実装して、あなたは[dictionary allKeys]の上に列挙する必要はありません

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

注:あなたは、ループ内のキーと値を使用する必要がある場合は、キーの値を取得する必要がありますキー。

あなたが値を自分で検索を行うにはしたくないとあなたはブロックが(iOSの4.0およびMac OS X 10.6以降)利用可能なOSをターゲットにする場合、あなたがブロックベースの方法enumerateKeysAndObjectsUsingBlock:使用することができます。

をあなたが定期的にループ内で breakを使用することができますしながら、ループから抜け出すために YES*stopを設定し、ブロックベースの方法で
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) { 
    // do stuff with key and value 
}];