アプリが必要とするデータ(データは基本的にフィード)を使用して、応答としてNSDictionaryを送り返すAPIと通信しています。このデータは、最新のものから古いものの順に並べ替えられ、最新の項目がNSDictionaryの先頭に表示されます。
for (NSString *key in articles) { ... }
を使用して高速に列挙すると、順序はランダムに見えるため、操作する順序は、希望どおりに新しいものから古いものへの順序ではなく、完全にランダムです。
読んだことがありますが、NSDictionaryで高速列挙を使用する場合、配列を順番に繰り返すことは保証されていません。
しかし、私は必要それをします。 NSDictionaryが含まれている順序でNSDictionaryを反復処理するにはどうすればよいですか?
1つの方法は、可変配列内のすべてのキーを取得することです。
NSMutableArray *allKeys = [[dictionary allKeys] mutableCopy];
次に、必要に応じて配列を並べ替えます。
[allKeys sortUsingComparator: ....,]; //or another sorting method
次に、配列を反復処理して(ここで高速列挙を使用すると順序が維持されると思います)、現在のキーのディクショナリ値を取得できます。
for (NSString *key in allKeys) {
id object = [dictionary objectForKey: key];
//do your thing with the object
}
辞書は、定義上、順序付けられていません。キーに順序を適用する場合は、キーを並べ替える必要があります。
NSArray *keys = [articles allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys) {
// process key
}
ニーズに合わせてキーの並べ替え方法を更新します。
次のように直接列挙することもできます。
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
for (NSString* key in xyz) {
id value = [xyz objectForKey:key];
// do stuff
}
これは、質問でzneakによって提供された回答から取得されます: NSMutableディクショナリにアクセスするためのObjective Cの各ループに対して
他の人が言ったように、NSDictionaryで注文を保証することはできません。また、allKeysプロパティを注文することは、本当に必要なものではない場合があります。キーがdictに挿入された順序でdictを列挙することが本当に必要な場合は、キーを格納するための新しいNSMutableArrayプロパティ/変数を作成して、キーがその順序を保持するようにすることができます。
Dictに新しいキーを挿入するたびに、それを配列に挿入します。
[articles addObject:someArticle forKey:@"article1"];
[self.keys addObject:@"article1"];
それらを順番に列挙するには、次のようにします。
for (NSString *key in self.keys) {
id object = articles[key];
}