If you're not targeting iOS 6 or OS X 10.8, I would like to point out that it's still remarkably easy to get subscripting to work. All you have to do is add the required methods as a category the classes you want subscripting to work for, and implement those methods appropriately. So add to the following classes the methods:
NSArray
: - (id)objectAtIndexedSubscript: (NSUInteger)index;
NSMutableArray
: - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;
NSDictionary
: - (id)objectForKeyedSubscript: (id)key;
NSMutableDictionary
: - (void)setObject: (id)obj forKeyedSubscript: (id)key;
Implementing this is a simple as calling the appropriate method for the class. For example, to implement subscripting on NSArray you just implement:
- (id) objectAtIndexedSubscript:(NSUInteger)index{
return [self objectAtIndex:index];
}
The only downside I can see is you need to make sure to import your category into any class that intends on using the subscripting. Of course, you can get around that requirement by including the #import
in your prefix header, usually the file: <appname>-Prefix.pch
. (thanks Josh Caswell for pointing that out).
One upside is you can alter the subscripting methods to suit your needs. For example, Apple doesn't allow you to add/remove objects to NSMutableArray using subscripting, but this can be accomplished easily enough:
- (void) setObject:(id)obj atIndexedSubscript:(NSUInteger)index{
if (index < self.count){
if (obj)
[self replaceObjectAtIndex:index withObject:obj];
else
[self removeObjectAtIndex:index];
} else {
[self addObject:obj];
}
}