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

转载 2015年07月09日 10:50:35

参考:

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)


iOS:编译错误[__NSDictionaryM objectAtIndexedSubscript:]: unrecognized selector sent to instance 0xa79e61

这个意思是,__NSDictionaryM  无法将值传到下标索引对象,言简意赅就是数组越界,但是再看看,这是数组吗?不是,所以,遇到这种crash,我这里有两种情况: 1.首先看看你 indexP...
  • u013243469
  • u013243469
  • 2014年11月17日 16:54
  • 8570

iOS报-[__NSDictionaryI objectAtIndexedSubscript:]: unrecognized selector sent to instance 0x15f762920

代码之前好使的,但是在更新的时候,不知道改了啥,点击播放视频就会报错,废话不多说,现在开始–排查:Terminating app due to uncaught exception ‘NSInvali...
  • haha_hello
  • haha_hello
  • 2017年02月16日 12:15
  • 2068

iOS reason: '-[__NSArrayM objectForKeyedSubscript:]: unrecognized selector sent to instance 0x60800

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄 一、源代码 NSDictionary * dic  = [NSJSONSerialization JSONObject...
  • shihuboke
  • shihuboke
  • 2017年09月10日 11:19
  • 426

iOS: NSDictionary的方法objectForKeyedSubscript:

- (id)objectForKeyedSubscript:(id)key
  • u011275873
  • u011275873
  • 2013年08月02日 18:28
  • 2780

-[__NSArrayI addObject:]: unrecognized selector与-[__NSArrayM objectForKeyedSubscript:]: unrecognized

-[__NSArrayI addObject:]: unrecognized selector与-[__NSArrayM objectForKeyedSubscript:]: unrecognized...
  • liyiyiSmile
  • liyiyiSmile
  • 2015年09月21日 16:22
  • 2810

xcode 运行出现类似-[__NSCFString objectForKey:]: unrecognized selector sent to instance的调试方法

1.在程序中任意的.m文件(最好在特定的文件中,如为解决此类问题单独建一个统一的.m文件)中添加类似以下代码 @implementation NSString (NSStringDe...
  • wzq9706
  • wzq9706
  • 2014年03月20日 17:39
  • 9096

IOS [NSNull objectForKey:]: unrecognized selector sent to [NSNull null]

[NSNull objectForKey:]: unrecognized selector sent to [NSNull null]
  • wengyupeng
  • wengyupeng
  • 2015年04月18日 20:31
  • 4403

iOS —— 数据解析Null处理

在使用JSON解析数据时总会出现null数据导致向某一对象发送消息时向NSNull发送,导致崩溃现象。 例:2016-06-07 11:48:02.008 MyDemo[1396:62255] -[...
  • linfengwenyou
  • linfengwenyou
  • 2016年06月07日 11:48
  • 2472

iOS错误处理之[__NSArrayM 某一方法名:]: unrecognized selector sent to instance

我们在进行iOS开发时,经常会遇到一些某名的错误,程序一运行,就会退到main函数中报错,搞的我们一头雾水! 例如: -[__NSArrayM isEqualToString:]: unrecog...
  • sky_2016
  • sky_2016
  • 2014年12月01日 21:42
  • 4805

iOS 数组越界,防Crash处理,性能优化 —— HERO博客

iOS 数组越界,防Crash处理,性能优化。
  • hero_wqb
  • hero_wqb
  • 2017年11月24日 17:22
  • 275
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting
举报原因:
原因补充:

(最多只允许输入30个字)