OC 为自己的类增加下标支持 obj[key] = value


原文地址:http://www.jianshu.com/p/0bb1b6bee194


楔子

本文是前面一篇文章《[iOS] [OC] 可变字典下标[]语法糖不是setObject:forKey: 而等效于KVC》探索的新发现。

下标的原理

下标subscripting是OC开发中常用的字典和数组的取值和设值方式,其中不可变字典和数组可以取值,可变字典和数组通过继承可以取值,同时还支持设值

    NSDictionary *dic = @{@"key":@"value"};
    NSString *value = dic[@"key"];  // 不可变字典取值

    NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
    mutableDic[@"key"] = @"value";  // 可变字典设值
    NSString *mValue = mutableDic[@"key"]; // 可变字典取值


    NSArray *array = @[@1, @2];
    NSNumber *num = array[0]; // 不可变数组取值

    NSMutableArray *mutableArray = [NSMutableArray array];
    [mutableArray addObject:@1];
    mutableArray[0] = @2;   // 可变数组设值
    NSNumber *mNum = mutableArray[0];  // 可变数组取值

下标的使用是iOS6以后支持的,取值和设值的原理是编译器调用了一套非正式的协议informal-protocol,这套协议的文档将下标分为两类,字典样式dictionary-style和数组样式array-style,分别要求实现对应协议的方法,从而支持下标的使用

// 字典样式
- (nullable ObjectType)objectForKeyedSubscript:(KeyType)key; // 取值
- (void)setObject:(nullable ObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)key; // 设值

// 数组样式
- (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx ; // 取值
- (void)setObject:(ObjectType)obj atIndexedSubscript:(NSUInteger)idx ; // 设值

除了实现实际需求的方法外,还需要定义的类在显示的声明或者遵从包含上述需求的特定方法的协议,
从而能被编译器正确识别。

此时回过头去看苹果的NSArrayNSMutableArrayNSDictionaryNSMutableDictionay在头文件有方法的声明,以及JSValueJSContext都有SubscriptSupportcategory,以及第三方的比如谷歌ProtobufferGPBDicionary类,数据库管理FMDBFMResultSet类以及钥匙串管理类UICKeyChainStore都有相关的声明和实现。

小结

如此以来就可以解释mutableDic[key] = nil不会出错的原因了,因为使用的是下标方法,而根据apple的可变字典文档的说明,传入nil会移除对应keyvalue



作者:席萍萍Brook_iOS深圳
链接:http://www.jianshu.com/p/0bb1b6bee194
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值