Objective-C如何自己實現一個基於數組下標的屬性訪問模式

來源:互聯網
上載者:User

標籤:

 在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;}
  

Objective-C如何自己實現一個基於數組下標的屬性訪問模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.