NSMutable辞書にアクセスするためのObjective-Cの各ループ


268

Objective-Cで変更可能な辞書のキーと値にアクセスする際に、いくつかの困難を発見しています。

私がこれを持っていると仮定します:

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

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

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

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

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

回答:


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

これは、NSFastEnumerationプロトコル(10.5以降とiOSで利用可能)に準拠するすべてのクラスで機能しNSDictionaryますが、値の代わりにキーを列挙できる数少ないコレクションの1つです。私はあなたが読ん示唆速い列挙話題のプログラミングコレクション

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


4
私は疑問に思っていましたが、そうではありませんでした:for(NSString * key in [xyz allKeys])?? またはそれは本当に重要ではありません。
FlowUI。SimpleUITesting.com

6
@ user76859403辞書を列挙すると、実際にはキーが列挙されます。for (NSString* key in [xyz allKeys])概念的には同じものです。
zneak

キーの列挙中に辞書を変更する必要がある場合は、[xyz allKeys]を使用します。以下の私の答えを参照してください。
Brody Robertson

このループは常に同じ順序を返しますか?または、TableViewセクションに使用する別の方法が必要ですか?
ymutlu 2014年

1
@ ymutlu、Cocoa辞書は順不同です。つまり、変更するたびに、反復する順序が変わる可能性があります。
zneak 2014年

98

ブロックを使用してキーと値を列挙するための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);
}];

2
辞書を列挙する3つの方法。。。えっと、VBには7種類のループがある "Strangest Language Feature"の答えを思い出します。
dreamlax 2010年

3
まあ... objectEnumeratorは1994年に、for(... in ...)は2006年頃に追加され、Blocksは2009年に追加されました。列挙のブロック形式は自然なフォールアウトです。
bbum

これは、... inコンストラクトの標準よりも速いようですoneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration
lkraider

1
@lkraider、私は実際にブロックベースの列挙を古いforループと比較していますが、for ... in構文とは比較していません。
Quinn Taylor

何の*stopためですか?それをどのように利用しますか?参照はありますか?
borisdiakur 2012

13

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

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

その理由はallKeys、キーのコピーを返すことです。したがって、辞書を変更しても安全です。
Honghao Zhang

5

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

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

どこtDictionaryに、NSDictionaryまたはNSMutableDictionary反復したいですか。



2

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

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


1

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


2
確かに、ただし、これは余分な自動解放された配列を作成します。これは、特に多くのキーを持つ辞書の場合、かなり無駄になる可能性があります。
Quinn Taylor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.