[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...

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

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

iOS: NSDictionary的方法objectForKeyedSubscript:

- (id)objectForKeyedSubscript:(id)key

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

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

swift继承自Objective-C基类时重载方法报错的问题

今天在学斯坦福的ios公开课时,使用Demo源码编译报错@IBAction func operate(sender: UIButton) { let operate = sender....

Objective-C学习笔记(二十七)——方法的重载与重写

学习面向对象编程,不得不提的一个特性就是多态,多态实现的方式就是方法的重写与重载。首先声明一下,在OC中是没有方法的重载的。 (一)方法重载        OC中没有重载这个概念,但是我们要知道重载是...

Objective-C 类的继承、方法重载

这次,我们讲解在Objective-C中如何进行类的继承以及方法的重载。按照惯例,我们还是先拿出一个重载的小例子,以例子为基础展开讲解。 1 2 3 4...

Objective-C 类的继承、方法重载

这次,我们讲解在Objective-C中如何进行类的继承以及方法的重载。按照惯例,我们还是先拿出一个重载的小例子,以例子为基础展开讲解。 1 2 3 4...

Objective-C 的方法原型及重载和覆盖

毫无疑问,Objective-C 也是一种面向对象语言,那么面向对象有三个基本特征(封装、继承、多态)。重载似乎与这三大特征没多大关系,方法覆盖才预示着多态。但重载还是与覆盖有一定的关联,它们都要求你...

Objective-C的方法原型和重载

毫无疑问,Objective-C 也是一种面向对象语言,那么面向对象有三个基本特征(封装、继承、多态)。重载似乎与这三大特征没多大关系,方法覆盖才预示着多态。但重载还是与覆盖有一定的关联,它们都要求你...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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