[Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting
来源:互联网 发布:淘宝指数怎么查询 编辑:程序博客网 时间:2024/06/05 01:56
参考:
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#1p[1]:NAME#2p[2]:NAME#3p[3]:(null)p["#0"]:NAME#1p["#1"]:NAME#2p["#2"]:NAME#3p["#3"]:(null)
0 0
- [Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting
- Objective-C的方法原型和重载
- objective-c中的方法重载
- Objective-C 中方法的重载,覆盖和隐藏
- Objective-C 的方法原型及重载和覆盖
- Objective-C 的方法原型及重载和覆盖
- Objective-C - 方法的声明和实现
- Objective-C 类的继承、方法重载
- Objective-C 类的继承、方法重载
- Objective-C中的继承和重载
- iOS: NSDictionary的方法objectForKeyedSubscript:
- Objective-C方法的实现
- Objective-c 类的继承 方法重写 方法重载
- Objective-C中的方法重载与初始化方法
- 转: Objective-c 类的继承 方法重写 方法重载
- Objective-C函数重载
- Objective-C 方法重载 - Selector 标识起决定作用
- objective-c中实现函数重载(黑魔法:__attribute__((overloadable)))
- svn服务端搭建与使用
- VC下的Unicode编程
- java数据结构之插入排序
- ExtJS学习笔记一:HelloWorld
- PL/SQL Developer创建Oracle用户
- [Objective-C] 重载objectAtIndexedSubscript和objectForKeyedSubscript方法实现subscripting
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
- #ifdef vs #if defined
- js日历
- iOS开发UI篇—Quartz2D使用(图形上下文栈)
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
- [安卓]新闻客户端(五) 主页面之slidingMenu & fragment(3)
- Java Web---登录验证和字符编码过滤器