Objective-C如何自己實現一個基於陣列下標的屬性訪問模式
原文地址: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];
}
@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[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;
}
相關文章
- 實現一個屬於自己的React框架(一)React框架
- 關於二維陣列指標的問題陣列指標
- Objective-C環境下的靜態陣列實現Object陣列
- js如何實現拷貝一個陣列JS陣列
- 陣列和指標的問題陣列指標
- NumPy 陣列屬性陣列
- 處理陣列中某一屬性陣列
- 資料安全合規需要從基於角色的訪問控制邁向基於屬性的訪問控制
- 如何用 JavaScript 實現一個陣列惰性求值庫JavaScript陣列
- 如何自己實現一個 EventBus
- 陣列物件按物件某個屬性排序陣列物件排序
- JavaScript 陣列 length 屬性JavaScript陣列
- php之像訪問陣列一樣訪問物件PHP陣列物件
- Objective-C語言在Category中實現屬性ObjectC語言Go
- 如何釋出第一個屬於自己的npm包NPM
- 如何開發屬於自己的第一個Java程式Java
- 如何開發屬於自己的第一個Java程式?Java
- 如何寫一個屬於自己的查成績appAPP
- Win10系統下如何全屏模式訪問工作列Win10模式
- 基於HttpClient實現Http訪問工具類HTTPclient
- 自己動手實現一個阻塞佇列佇列
- AWS身份和訪問管理模組新增標籤和基於屬性的訪問控制能力
- js訪問物件屬性的2個方法JS物件
- 終於實現了一門屬於自己的程式語言
- 線性表1.0(陣列實現)陣列
- 基於BIT陣列實現全域性功能開關陣列
- 如何實現一個基於 DOM 的模板引擎
- Vector用陣列下標訪問的條件陣列
- 一、訪問物件屬性和方法的操作物件
- 基於Docker的MongoDB實現授權訪問DockerMongoDB
- 自己實現一個 DFA 串模式識別器(一)模式
- 一個關於JS解決陣列相乘問題JS陣列
- Java基礎學習之陣列基本屬性和方法Java陣列
- Lesson4——NumPy 陣列屬性陣列
- orcale 之遊標的屬性
- 如何將一個陣列中的元素插入另一個陣列陣列
- Word製作屬於自己的DIY個性工具欄
- oracle通過sys_context實現各使用者只能訪問屬於自己的資料OracleContext