How do I loop through all objects in a NSMutableDictionary regardless of the keys?
looping through an NSMutableDictionary
Asked Answered
A standard way would look like this
for(id key in myDict) {
id value = [myDict objectForKey:key];
[value doStuff];
}
Better to iterate through keys though (i.e.
id key in myDict.allKeys
), rather than the dictionary. This allows you to mutate the dictionary, which might be what you want to do. –
Hilar you can use
[myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
// do something with key and obj
}];
if your target OS supports blocks.
You can use [dict allValues]
to get an NSArray
of your values. Be aware that it doesn't guarantee any order between calls.
I would use this one over the (id key in dictionary), especially on a mutable dictionary, since the latter throws a nasty error if the dictionary is modified while being enumerated. –
Upbuild
"it doesn't guarantee" - this is frequently needed (most languages have a version of dictionary that DOES guarantee order) - does it in practice preserve order? –
Eliott
@Eliott On MacOS X, I had pretty mixed up order (not order of insertion, not alphabetic, nothing), but consistent between calls. –
Legitimacy
Why use a NSDictionary if the mappings don't matter? –
Hearken
@Hearken Usually it matters somewhere and doesn't elsewhere. You also get the unique key constraint that might be useful for some cases. –
Legitimacy
- For simple loop, fast enumeration is a bit faster than block-based loop
- It's easier to do concurrent or reverse enumeration with block-based enumeration than with fast enumeration When looping with NSDictionary you can get key and value in one hit with a block-based enumerator, whereas with fast enumeration you have to use the key to retrieve the value in a separate message send
in fast enumeration
for(id key in myDictionary) {
id value = [myDictionary objectForKey:key];
// do something with key and obj
}
in Blocks :
[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// do something with key and obj
}];
You don't need to assign value to a variable. You can access it directly with myDict[key]
.
for(id key in myDict) {
NSLog(@"Key:%@ Value:%@", key, myDict[key]);
}
Another way is to use the Dicts Enumerator. Here is some sample code from Apple:
NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;
while ((value = [enumerator nextObject])) {
/* code that acts on the dictionary’s values */
}
© 2022 - 2024 — McMap. All rights reserved.
for (id key, value in myDict)
that would be perfect. – Keshiakesia