iOS 自定义类之下表访问

788 阅读1分钟

在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、内部的具体实现需要自己实现。