Accessing keys in NSDictionary using [key] notation?
Asked Answered
C

2

6

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.

Cupel answered 14/2, 2013 at 15:38 Comment(6)
They are fairly new "Objective-C Literals", but have been much-discussed here. Duplicate questions will follow. clang.llvm.org/docs/ObjectiveCLiterals.htmlPhone
The question should rather be: how could you've been hiding from this broadly discussed language extension coming within the last year.Roslyn
#12120653Phone
#9694147Phone
possible duplicate of What are the details of "Objective-C Literals" mentioned in the Xcode 4.4 release notes?Phone
Thank you, most of these seem to focus on the inclusion of object literals (i.e. @{} or @() and @[] for NSArray, very few bother to mention that @[] also works with NSDictionay which is why I believe I over looked it. Much appreciated ...Cupel
H
13

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!

Hekate answered 14/2, 2013 at 15:41 Comment(1)
@Cupel Go wild with this: I added a category on NSSegmentedControl to make segment addition FAR easier programmatically. Little things like this make my day a lot more fun! :)Hekate
R
0

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... ;-)

Regolith answered 14/2, 2013 at 15:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.