OC如何实现自定义类能使用下标访问模式

前言

自定义类,有一个字典属性dict,self[@"xxx"] = @"xxx";操作却等同于self.dict[@"xxx"] = @"xxx";第一次接触到此用法,在不明原理之前,感觉非常灵异,弄明白原因后又觉得茅舍顿开,在此做下笔记。

下标访问属性机制

Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定。当你实现了这其中的方法之后即可使用数组下标来访问属性元素。
实现- (id)objectAtIndexedSubscript:(NSUInteger)idx(void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index方法。我们可以像访问数组一样来来存取自定义的类。
实现- (id)objectForKeyedSubscript:(id)key- (void)setObject:(id)object forKeyedSubscript:(id < NSCopying >)aKey方法,我们就可以像访问字典一样来访问我们自定义的类。

demo

//
//  parent.m
//  TEST
//
//  Created by yzl on 2016/11/16.
//  Copyright © 2016年 SZY. All rights reserved.
//

#import "parent.h"
#import "parent+pravite.h"
@interface parent()
@property (strong, nonatomic) NSMutableDictionary *dict;
@property (strong, nonatomic) NSMutableArray *array;

@end

@implementation parent
- (instancetype)init{
    self = [super init];
    if (self) {
    }
    return self;
}

- (NSMutableDictionary *)dict{
    if (!_dict) {
        _dict = [NSMutableDictionary dictionary];
    }
    return _dict;
}

- (NSMutableArray *)array{
    if (!_array) {
        _array = [NSMutableArray array];
    }
    return _array;
}

- (void)setObject:(id)obj forKeyedSubscript:(id )key{
    self.dict[key] = obj;
}

- (id)objectForKeyedSubscript:(id)key{
    return self.dict[key];
}

- (id)objectAtIndexedSubscript:(NSUInteger)idx{
    return self.array[idx];
}
- (void)setObject:(id)anObject atIndexedSubscript:(NSUInteger)index{
    const NSUInteger length = [self.array count];
    if(index > length)
        return;

    if(index == length)
        [self.array addObject:anObject];
    else
        [self.array replaceObjectAtIndex:index withObject:anObject];
}
@end

调用

  parent *p = [[parent alloc]init];
    p[@"key"] = @"value";
    p[0] = @(8);

    NSLog(@"%@ %@",p[@"key"],p[0]);

打印结果是:value 8

参考

为了使自己的描述专业点,参考了以下博客

  • Objective-C如何自己实现一个基于数组下标的属性访问模式

你可能感兴趣的:(OC如何实现自定义类能使用下标访问模式)