Objective-C如何自己实现一个基于数组下标的属性访问模式
来源:互联网 发布:品牌网络推广渠道 编辑:程序博客网 时间:2024/05/18 03:30
原文地址:http://www.cnblogs.com/zenny-chen/p/3593660.html
在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定。当你实现了这其中的方法之后即可使用数组下标来访问属性元素。
在Foundation库中,NSArray类实现了- (id)objectAtIndexedSubscript:(NSUInteger)idx方法。因此,我们可以这么来访问数组元素:
NSArray *arr = @[@100, @200, @300];NSNumber *num = arr[0];
上述arr[0]就相当于[arr objectAtIndex:0]。
而NSMutableArray在基于NSArray的基础上又实现了- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index方法。这样我们可以通过数组下标来读写相应元素,比如:
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@100, @200, @300]];arr[2] = arr[0];
而NSDictionary类实现了- (id)objectForKeyedSubscript:(id)key方法。这样我们能以数组下标的形式来访问相应键的值。比如:
NSDictionary *dict = @{@"key" : @"value"};NSString *value = dict[@"key"];
而NSMutableDictionary在NSDictionary类的基础上又实现了- (void)setObject:(id)object forKeyedSubscript:(id < NSCopying >)aKey方法。这样,我们能以数组下标的方式来读写相应键的值。比如:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{@"key":"@Hello"}];dict[dict[@"key"]] = @"world";
下面我们通过实现这四个方法,自己实现一个能同时使用这四种下标方式访问模式的类。
//// main.m// objCTest//// Created by Zenny Chen on 12-2-7.// Copyright (c) 2014年 Neon Media Studio. All rights reserved.//#import <Foundation/Foundation.h>@interface MyContainer : NSObject{@private NSMutableDictionary *mDict; NSMutableArray *mArray;}- (void)setObject:(id)object forKeyedSubscript:(id < NSCopying >)aKey;- (id)objectForKeyedSubscript:(id)key;- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index;- (id)objectAtIndexedSubscript:(NSUInteger)idx;@end@implementation MyContainer- (instancetype)init{ self = [super init]; mDict = [[NSMutableDictionary alloc] initWithDictionary:@{@"key1":@"value1", @"key2":@"value2"}]; mArray = [[NSMutableArray alloc] initWithArray:@[@100, @200, @300, @400]]; return self;}- (void)dealloc{ if(mDict != nil) { [mDict removeAllObjects]; [mDict release]; mDict = nil; } if(mArray != nil) { [mArray removeAllObjects]; [mArray release]; mArray = nil; } [super dealloc];}- (void)setObject:(id)object forKeyedSubscript:(id < NSCopying >)aKey{ [mDict setObject:object forKey:aKey];}- (id)objectForKeyedSubscript:(id)key{ return [mDict objectForKey:key];}- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index{ const NSUInteger length = [mArray count]; if(index > length) return; if(index == length) [mArray addObject:anObject]; else [mArray replaceObjectAtIndex:index withObject:anObject];}- (id)objectAtIndexedSubscript:(NSUInteger)idx{ if(idx >= [mArray count]) return nil; return [mArray objectAtIndex:idx];}@endint main (int argc, const char * argv[]){ @autoreleasepool { // insert code here... MyContainer *cont = [[MyContainer alloc] init]; cont[@"mykey"] = @"myvalye"; NSLog(@"key1 is: %@", cont[@"key1"]); NSLog(@"key2 is: %@", cont[@"key2"]); NSLog(@"mykey is: %@", cont[@"mykey"]); cont[4] = @500; cont[2] = @-300; NSLog(@"The value[4] = %@", cont[4]); NSLog(@"The value[3] = %@", cont[3]); NSLog(@"The value[2] = %@", cont[2]); } return 0;}
0 0
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- Objective-C实现一个基于数组下标[index]和字典[@"key"]的访问模式
- 给自己的类实现下标访问
- 在一个数组里实现不同的下标访问不一样的数据类型。
- c语言实现在一个数组中求出最大数所在的下标
- Objective-C 声明一个C语言类型的数组和访问方式@property
- Objective-c LLVM 4.0 的新特性 NSArray支持下标访问
- 使自己的类支持下标[]访问
- c++中如何使二级指针能够像数组下标模式访问
- 编程笔记(Objective-c:属性的实现)
- 编程笔记(Objective-c:属性的实现)
- Vector用数组下标访问的条件
- 如何在Xcode4.4中使用Objective-C的对象下标表示法
- Objective-C 类属性和方法的访问权限
- NYOJ 贪心 vector的使用,是一个数组,有重复数据,可以下标访问
- pmtest1.asm from 自动手写操作系统 粗略解释
- redis管理工具——Redis Desktop Manager
- GoldenGate部分运维命令
- 一道JS面试题
- 错误中学习--TypeError: this.ds.fields.get(...) is undefined
- Objective-C如何自己实现一个基于数组下标的属性访问模式
- html中a标签点击去掉高亮背景
- Linux下的tty和pts详解
- 【linux系统加固之】uclibc加固
- 简单的生成二维码的小demo,扫描后可以看到你自定义的信息
- RecycleView子view不能全屏
- 自定义android EditText样式及使用方式
- 狗眼看芯片之ARM
- 解决 - java.lang.OutOfMemoryError: unable to create new native thread