Objective-C如何自己实现一个基于数组下标的属性访问模式
在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定。当你实现了这其中的方法之后即可使用数组下标来访问属性元素。
在Foundation库中,NSArray类实现了- (id)objectAtIndexedSubscript:(NSUInteger)idx方法。因此,我们可以这么来访问数组元素:
NSArray *arr = @[@, @, @];
NSNumber *num = arr[];
上述arr[0]就相当于[arr objectAtIndex:0]。
而NSMutableArray在基于NSArray的基础上又实现了- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index方法。这样我们可以通过数组下标来读写相应元素,比如:
NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@, @, @]];
arr[] = arr[];
而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:@[@, @, @, @]]; 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];
} @end int 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[] = @;
cont[] = @-; NSLog(@"The value[4] = %@", cont[]);
NSLog(@"The value[3] = %@", cont[]);
NSLog(@"The value[2] = %@", cont[]);
} return ;
}
Objective-C如何自己实现一个基于数组下标的属性访问模式的更多相关文章
- 教你如何使用Java手写一个基于数组实现的队列
一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...
- javascript创建一个基于数组的栈结构
栈是一种遵从后进先出(LIFO)原则的有序集合.新添加或待删除的元素都保存在栈的同 一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 栈拥有以下方法: push(eleme ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- vue监听数组中某个属性,计算其他属性问题
今天在项目开发中遇到一个根据数组中某个属性变化同时更新另一个属性变化的问题,刚开始代码如下 this.weekList1=r.data.roomProducts; this.weekList1.map ...
- 开源一个基于nio的java网络程序
因为最近要从公司离职,害怕用nio写的网络程序没有人能看懂(或许是因为写的不好吧),就调整成了mina(这样大家接触起来非常方便,即使没有socket基础,用起来也不难),所以之前基于nio写的网络程 ...
- 基于visual Studio2013解决算法导论之023队列实现(基于数组)
题目 基于数组的队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...
- "《算法导论》之‘线性表’":基于数组实现的单链表
对于单链表,我们大多时候会用指针来实现(可参考基于指针实现的单链表).现在我们就来看看怎么用数组来实现单链表. 1. 定义单链表中结点的数据结构 typedef int ElementType; cl ...
- Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本片我们分析基础数组的实现--ArrayList,不会分析整个集合的继承体系,这不是本系列文章重点. 源码分析都是基于"安卓版" ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
随机推荐
- 【Distributed】分布式配置中心
一.概述 1.1 什么是分布式配置中心 常用分布式配置中心框架 二.Apollo阿波罗 2.1 Apollo特点 2.2 Apollo整体架构原理 2.3 Apollo Portol 环境搭建 Lin ...
- Android 连接.net WebService 工具类代码
安卓代码: import android.os.Handler;import android.os.Message; import org.ksoap2.SoapEnvelope;import org ...
- skeleton directory: /etc/skel
第一次接触这个词汇 还是在LFS8.2里面,感觉有点吓人.好好一个计算机操作系统,怎么搞出这个恐怖的术语.... 当使用useradd 或者其他命令创建用户的时候,/etc/skel这个目录下的文件. ...
- 队列(queue)和堆栈(stack)的学习
队列 1 . 先进先出 .队列尾进行插入,队列头进行删除,获取,修改. -----first come ,first served . --first in .first out ...
- linux实操_shell运算符
1."$((运算式))"或"[运算式]" 2.expr m + n 注意:expr运算符要有空格 3.expr m - n 4.expr \*,/,/% 乘,除 ...
- BZOJ 3576: [Hnoi2014]江南乐 (SG函数)
题意 有nnn堆石子,给定FFF,每次操作可以把一堆石子数不小于FFF的石子平均分配成若干堆(堆数>1>1>1). 平均分配即指分出来的石子数中最大值减最小值不超过111.不能进行操 ...
- 边学边体验django
django菜鸟入门连接:http://www.runoob.com/django/django-template.html 安装以及Demo里面都有. 我边学边在电脑上演示,然后发现一些和实际不一样 ...
- Python 11--文件流
- python原生操作mysql
import pymysql HOST = '127.0.0.1' PORT = 3306 USER = 'root' PASSWD = ' DB = 'test' CHARSET = 'utf8' ...
- 006_linux驱动之_ioremap函数使用
(一)学习linux驱动之初,对ioremap函数的个人理解 (二)博客:实验探究 ioremap 这篇文章作者通过验证来阐述自己的观点,个人觉得挺好的 (三)函数原型 基本简介 void * __i ...