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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前言:本篇作為自己對Objective-C的基礎加強篇總結,整理各種OC知識點,會持續(xù)更新。復習一下,也為以后做準...
    齊舞647閱讀 1,015評論 0 7
  • Objective-C 2.0一開始用在GCC編譯器上,后來因為GCC嚴格的GPL許可證使得Apple不得不尋找新...
    zenny_chen閱讀 1,041評論 0 0
  • 大綱 26.Protocol-協議 27.delegate-代理 28.Foundation框架介紹 29.NSS...
    天天想念閱讀 1,444評論 0 2
  • 讀到這篇“什么是優(yōu)秀的設計思維與方法”,很有啟發(fā)。講的東西也是自己無論在做設計還是闡述設計上一直都有的誤區(qū)和局限。...
    萬塔閱讀 2,615評論 1 1

友情鏈接更多精彩內容