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.
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!
Refer to "Modern Objective-C", introduced in iOS 6.
See the WWDC 2012 video: Migrating to Modern Objective-C.
So, no, the feature is not really new and you have overlooked it... ;-)