关闭

[Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting

4659人阅读 评论(0) 收藏 举报

参考:

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)


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2700186次
    • 积分:23554
    • 等级:
    • 排名:第276名
    • 原创:158篇
    • 转载:596篇
    • 译文:0篇
    • 评论:201条
    最新评论