Accessing keys in NSDictionary using [key] notation?

fuzzygoat picture fuzzygoat · Feb 14, 2013 · Viewed 7.5k times · Source

I have just realised that I can access NSDictionary using both objectForKey: and dict[key]?

NSDictionary *coordsDict = @{@"xpos": @5.0, @"ypos": @7.2, @"zpos": @15.7};
NSLog(@"XPOS: %@", coordsDict[@"xpos"]);
NSLog(@"XPOS: %@", [coordsDict objectForKey:@"xpos"]);

Can anyone tell me if this has been hiding from me all along or if its some fairly recent change to the language?

EDIT: The question does not generically refer to the new string literals, but more specifically to accessing NSDictionary with the same string literal syntax you would use for NSArray. I obviously overlooked this and just wanted to check when this particular syntax was added.

Answer

Aditya Vaidyam picture Aditya Vaidyam · Feb 14, 2013

This is a new addition to Xcode 4.4+ and relies on Apple's LLVM+Clang compiler. It's a new feature :) Arrays can also be accessed with the same notation: myObjectArray[4].

If you're interested in adding this new feature to your own classes (called subscripting), there's a few methods you can implement:

@interface NSArray(Subscripting)
- (id)objectAtIndexedSubscript:(NSUInteger)index;
@end

@interface NSMutableArray(Subscripting)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index;
@end

@interface NSDictionary(Subscripting)
- (id)objectForKeyedSubscript:(id)key;
@end

@interface NSMutableDictionary(Subscripting)
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end

If you implement any of these methods on your own classes, you can subscript on them. This is also how you can add this feature to OS X 10.7 too!