web-dev-qa-db-ja.com

NSMutabledictionaryにアクセスするためのObjective Cの各ループ

Objective-Cで変更可能な辞書のキーと値にアクセスするのが困難になっています。

これがあるとします。

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

キーと値を設定できます。今は、それぞれのキーと値にアクセスしたいだけですが、設定されているキーの数がわかりません。

PHPでは、とても簡単です。

foreach ($xyz as $key => $value)

Objective-Cではどのように可能ですか?

257
for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

これは、NSFastEnumerationプロトコル(10.5以降およびiOSで利用可能)に準拠するすべてのクラスで機能します。ただし、NSDictionaryは、値の代わりにキーを列挙できる少数のコレクションの1つです。 コレクションプログラミングのトピック の中で 速い列挙型 について読むことをお勧めします。

ああ、私はあなたがそれを通して列挙しながら決してコレクションを変更するべきではないことを付け加えるべきです。

641
zneak

ブロックを使用してキーと値を列挙するための10.6+オプションを除外しないためには...

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

アクションを同時に実行したい場合は、次のようにします。

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
97
Quinn Taylor

列挙している間に辞書にmutateをつける必要があるなら:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
13
Brody Robertson

辞書を列挙する最も簡単な方法は

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}

ここでtDictionaryは、繰り返したいNSDictionaryまたはNSMutableDictionaryです。

4
Avinash

Collections Collections for Cocoa列挙:コレクションの要素を移動する の部分を読むことをお勧めします。あなたの必要性のためのサンプルコードがあります。

4

高速列挙は10.5とiPhone OSで追加されました、そしてそれは構文糖だけではなく、かなり速いです。古いランタイム(つまり10.4以降)をターゲットにする必要がある場合は、古い列挙方法を使用する必要があります。

NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;

while ((key = [keyEnum nextObject]))
{
    id value = [myDict objectForKey:key];
    ... do work with "value" ...
}

列挙体オブジェクトを解放しないで、リセットすることはできません。やり直す場合は、辞書から新しい列挙オブジェクトを要求する必要があります。

2
dreamlax

-[NSDictionary allKeys] を使ってすべてのキーにアクセスし、それをループすることができます。

1
gcamp