281

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

私がこれを持っているとしましょう:

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

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

PHPでは、次のように非常に簡単です。

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

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

4

7 に答える 7

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

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

ああ、ただし、コレクションを列挙している間は決してコレクションを変更しないでください。

于 2010-01-26T23:06:01.767 に答える
101

ブロックを使用してキーと値を列挙するための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);
}];
于 2010-01-27T05:43:35.067 に答える
16

列挙中に辞書を変更する必要がある場合:

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
于 2013-06-03T20:10:00.223 に答える
5

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

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

繰り返したいorはどこにtDictionaryありますか。NSDictionaryNSMutableDictionary

于 2013-12-17T10:17:01.693 に答える
5

Enumeration: Traversing a Collection's ElementsCollections Programming Guide for Cocoaを読むことをお勧めします。必要に応じてサンプルコードがあります。

于 2010-01-26T23:05:54.233 に答える
3

高速列挙は 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" ...
}

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

于 2010-01-27T00:40:27.043 に答える
2

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

于 2010-01-26T23:07:57.677 に答える