美文网首页
OC如何实现自定义类能使用下标访问模式

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

作者: 水水兔 | 来源:发表于2019-12-06 17:05 被阅读0次

    前言

    自定义类,有一个字典属性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 <NSCopying>)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

    参考

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/yvyegctx.html