for ループで複数の値を使用しようとしていました。2 つの個別の for ループを作成すると、コードが 2 回繰り返されるので、これを試しました。
for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){
でもダメ!!どうすればできますか??
for ループで複数の値を使用しようとしていました。2 つの個別の for ループを作成すると、コードが 2 回繰り返されるので、これを試しました。
for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){
でもダメ!!どうすればできますか??
NSDictionary
このための特別なブロックベースの方法を提供します。
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// do something with key and obj
}];
まず、変数名は小文字で始める必要があります。
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
}
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
コンテンツを反復処理する前に、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);
}];
私はあなたがそれを行うことができるとは思わない. 行を見るだけで、コンパイラのセマンティックの問題があります。これは、Key と Key2 を同時に並行して繰り返すことを意味しますか? 両方のキーが非 nil の場合にのみループに入ることを意味しますか? 2 つのセットを連結して繰り返すということですか? 等...
あなたの Dictionary は、あなたがやりたいことに適したデータ構造ではないかもしれません。
これはあなたがやろうとしていることでうまくいきませんか?
for (NSString* Key in [Dictionary allKeys]) {
NSString* Key2 = [Dictionary objectForKey:Key]?
// ...
}
または、両方のセットを単一の配列に連結し、それが必要な場合は反復することもできます。