参考:
http://stackoverflow.com/questions/3613980/can-i-overload-an-operator-in-objective-c
http://stackoverflow.com/questions/13028574/objective-c-ios6-operator-overloading-const-id
C++ 支持运算符重载,但 Objective-C 中不支持。
然而,Objc 中可以看到下面的用法
id obj = dict[@"keyStr"];
它和
id obj = [dict objectForKey:@"keyStr"];
等价。这里的 [] 的用法貌似是一种运算符重载,然而它的名字叫 subscripting。
下面是一个 subscripting 的小例子。通过重载 objectAtIndexedSubscript和objectForKeyedSubscript方法,可以实现 ”整数形式的“ 和 ”object形式的“ 两种 subscripting:
// ========= Person.h ==========
#import <Foundation/Foundation.h>
@interface Person: NSObject
-(id) objectAtIndexedSubscript:(NSUInteger)idx;
-(id) objectForKeyedSubscript:(id)key;
@property NSString* name1;
@property NSString* name2;
@property NSString* name3;
// ========= Person.m ==========
#import "Person.h"
-(id) init {
if (self = [super init]) {
_name1 = [[NSString alloc] init];
_name1 = @"NAME#1";
_name2 = [[NSString alloc] init];
_name2 = @"NAME#2";
_name3 = [[NSString alloc] init];
_name3 = @"NAME#3";
}
return self;
}
-(id) objectAtIndexedSubscript:(NSUInteger)idx {
switch (idx) {
case 0:
return _name1;
case 1:
return _name2;
case 2:
return _name3;
default:
return nil;
}
}
-(id) objectForKeyedSubscript:(id)key {
if ([key isEqualToString:@"#0"]) {
return _name1;
} else if ([key isEqualToString:@"#1"]) {
return _name2;
} else if ([key isEqualToString:@"#2"]) {
return _name3;
}
return nil;
}
// ========= main.m ==========
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person* p = [[Person alloc] init];
NSLog(@"p[0]:%@", p[0]);
NSLog(@"p[1]:%@", p[1]);
NSLog(@"p[2]:%@", p[2]);
NSLog(@"p[3]:%@", p[3]);
NSLog(@"p[\"#0\"]:%@", p[@"#0"]);
NSLog(@"p[\"#1\"]:%@", p[@"#1"]);
NSLog(@"p[\"#2\"]:%@", p[@"#2"]);
NSLog(@"p[\"#3\"]:%@", p[@"#3"]);
}
return 0;
}
运行结果:
p[0]:NAME#1
p[1]:NAME#2
p[2]:NAME#3
p[3]:(null)
p["#0"]:NAME#1
p["#1"]:NAME#2
p["#2"]:NAME#3
p["#3"]:(null)