前言
自定义类,有一个字典属性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
参考
为了使自己的描述专业点,参考了以下博客