Maps in Objective-C
Maps are built-in associative data types (sometimes called hashes or dicts in other languages).
To create an empty map, use NSMutableDictionary.
#import <Foundation/Foundation.h>
int main() {
@autoreleasepool {
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];Set key/value pairs using the method setObject:forKey:.
[m setObject:@7 forKey:@"k1"];
[m setObject:@13 forKey:@"k2"];Printing a map using NSLog will show all of its key/value pairs.
NSLog(@"map: %@", m);Get a value for a key using objectForKey:.
NSNumber *v1 = [m objectForKey:@"k1"];
NSLog(@"v1: %@", v1);If the key doesn’t exist, nil is returned.
NSNumber *v3 = [m objectForKey:@"k3"];
NSLog(@"v3: %@", v3);The method count returns the number of key/value pairs when called on a map.
NSLog(@"len: %lu", (unsigned long)[m count]);The method removeObjectForKey: removes key/value pairs from a map.
[m removeObjectForKey:@"k2"];
NSLog(@"map: %@", m);To remove all key/value pairs from a map, use removeAllObjects.
[m removeAllObjects];
NSLog(@"map: %@", m);The optional second return value when getting a value from a map indicates if the key was present in the map. This can be checked using objectForKey: and verifying that the return value is not nil.
NSNumber *prsValue = [m objectForKey:@"k2"];
BOOL prs = prsValue != nil;
NSLog(@"prs: %d", prs);You can also declare and initialize a new map in the same line with this syntax.
NSMutableDictionary *n = @{ @"foo": @1, @"bar": @2 }.mutableCopy;
NSLog(@"map: %@", n);A simplified way to compare the dictionaries, assuming you are checking equality by content, could be using isEqualToDictionary:.
NSMutableDictionary *n2 = @{ @"foo": @1, @"bar": @2 }.mutableCopy;
if ([n isEqualToDictionary:n2]) {
NSLog(@"n == n2");
}
}
return 0;
}When printed, maps appear in the form {"k1":7, "k2":13}.
$ clang -fobjc-arc -framework Foundation maps.m -o maps
$ ./maps
map: {
k1 = 7;
k2 = 13;
}
v1: 7
v3: (null)
len: 2
map: {
k1 = 7;
}
map: {
}
prs: 0
map: {
bar = 2;
foo = 1;
}
n == n2