Hi gcc'ers,
I was wondering if it would be a useful extension to Objective-C
expand the [] operator
to support array and hash references to NSArray and NSDictionary
classes directly to
greatly improve the readability of code:
NSArray<AVAudioPlayer *> *players = [NSArray arrayWithObjects:..., nil];
[players[0] play]; // expanded by compiler to: [(AVAudioPlayer *)
[players objectAtIndex:0] play];
players[0] = aPlayer // expanded to: [players replaceObjectAtIndex:0
withObject:aPlayer]; or for NSDictionary:
NSDictionary<AVAudioPlayer *> *playersDict = [NSDictionary ....];
[playersDict[@"playerOne"] play]; // -> [(AVAudioPlayer *)[playersDict
objectForKey:@"playerOne"] play];
playersDict[@"playerTwo"] = aPlayer; // becomes: [players
setObject:aPlayer forKey:@"playerTwo"];
This also makes use of a form of templates for Objective-C containers
which might also be a useful extension.
@interfcae NSArray<T> : NSObject {
- (T)objectAtIndex:(NSUInteger)index;
@end
@interface NSMutableObject<T> : NSArray {
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(T)anObject
@end
Where not specified, type T would default to (id) for backward
compatibility.
I've looked at the code and such an extension would involve code
generation inside
the subscript operator which looks difficult but if you want me to
have a go and
can provide some pointers let me know. I know this introduces coupling
between
the compiler and the runtime but I would have thought the benefits
outweighed this.
Perhaps classes which wish to support subscripting make methods
available by convention:
for NSArray:
- (id)operatorSubscriptInt:(NSUInteger)index;
- (id)operatorSubscriptObject:(id)key;
for NSDictionary
- (id)operatorSubscriptInt:(NSUInteger)index setValue:(id)anObject;
- (id)operatorSubscriptObject:(id)key setValue:(id)anObject;
I know, it sounds like one step on the way to operator overloading....
Best Regards & Thanks for your work,
John Holdsworth