在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定。当你实现了这其中的方法之后即可使用下标或key值来访问属性元素。
给自定义的类添加方法:
- objectAtIndexedSubscript:下标访问元素;
- id p0 = p[0];
- setObject: atIndexedSubscript:下标设置元素;
- p[0] = @1;
- objectForKeyedSubscript:根据key值访问元素;
- pName = p[@"name"];
- setObject: forKeyedSubscript:根据key值设置元素;
- p[@"name"] = @"lili";
Person.h
@interface Person : NSObject
- (id)objectAtIndexedSubscript:(NSUInteger)index;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
- (id)objectForKeyedSubscript:(id)key;
- (void)setObject:(id)obj forKeyedSubscript:(nonnull id<NSCopying>)key;
@end
Person.m
@interface Person ()
@property (nonatomic, strong) NSMutableArray *arrData;
@property (nonatomic, strong) NSMutableDictionary *dictData;
@end
@implementation Person
- (id)objectAtIndexedSubscript:(NSUInteger)index {
if (index < self.arrData.count) {
return self.arrData[index];
}
return nil;
}
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx {
if (idx < self.arrData.count) {
self.arrData[idx] = obj;
} else {
// error
}
}
- (id)objectForKeyedSubscript:(id)key {
if (key == nil) {
// error
return nil;
}
return [self.dictData objectForKey:key];
}
- (void)setObject:(id)obj forKeyedSubscript:(nonnull id<NSCopying>)key {
if (key == nil) {
// error
}
if (obj == nil) {
[self.dictData removeObjectForKey:key];
return;
}
[self.dictData setObject:obj forKey:key];
}
- (NSMutableArray *)arrData {
if (_arrData == nil) {
_arrData = @[].mutableCopy;
}
return _arrData;
}
- (NSMutableDictionary *)dictData {
if (_dictData == nil) {
_dictData = @{}.mutableCopy;
}
return _dictData;
}
@end
说明:
- 1、object的类型可以自定义,key也可以自定义;
- 2、内部的具体实现需要自己实现。