给所有的OC类添加类似字典的存储方法

关键字: runtime 下标语法 字典(NSDictionary)

背景

开发中经常遇到要给某个对象添加的存储的变量,有时候不得不写个熟悉或增加成员变量,如果是系统或第三方类,还需要继承或写分类的方式实现,为了简便开发,利用下标语法和runtime实现给所有对象添加类似字典的存储方式存储值

具体实现

NSObject+ ZQQBindDataLikeDictionary.h

@interface NSObject (ZQQBindDataLikeDictionary)
- (NSObject *)objectForKeyedSubscript:(NSObject *)key;
-(void)setObject:(NSObject *)obj forKeyedSubscript:(NSObject *)key;
@end

NSObject+ ZQQBindDataLikeDictionary.m

import "NSObject+ZQQBindDataLikeDictionary.h"

#import <objc/runtime.h>
#define kZqqExtensionBindDataSaveKey @"kZqqExtensionBindDataSaveKey"
@implementation NSObject (ZQQBindDataLikeDictionary)
- (NSObject *)objectForKeyedSubscript:(NSObject *)key
{
if ([self isKindOfClass:[NSDictionary class]]) {
NSDictionary *dictSelf = (NSDictionary *)self;
return [dictSelf objectForKey:key];
}else{
NSDictionary *bindDict = objc_getAssociatedObject(self,(__bridge const void *)(key));
if (bindDict == nil) {
return nil;
}
return [bindDict objectForKey:kZqqExtensionBindDataSaveKey];
}
return nil;
}
- (void)setObject:(NSObject *)obj forKeyedSubscript:(NSObject *)key
{
if ([self isKindOfClass:[NSMutableDictionary class]]) {
NSDictionary *dictSelf = (NSDictionary *)self;
[dictSelf setObject:obj forKeyedSubscript:key];
}else if ([self isKindOfClass:[NSDictionary class]]) {
// NSDictionary *dictSelf = (NSDictionary *)self;
// [dictSelf setObject:obj forKeyedSubscript:key];
}else{
NSDictionary *bindDict = nil;
if (obj != nil) {
bindDict = @{kZqqExtensionBindDataSaveKey:obj};
}
objc_setAssociatedObject(self, (__bridge const void *)(key), bindDict, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
}
@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,885评论 0 9
  • 终于把前面的base文件夹简简单单的看了一遍,终于可以回到正片上来了,保证不烂尾。 项目天天用yymodel解析数...
    充满活力的早晨阅读 5,276评论 1 0
  • 村里孩子,食五谷杂粮长大,从地里带出来的地气味道,自然可以杀上九重天!下盘够扎实![阴险][奸笑][悠闲] 二椅子...
    纵情嬉戏天地间阅读 1,234评论 0 1
  • 历史毕竟是历史,在线性的时间尺度里,后人无法完全了解前面的时间里发生了什么。因此留下诸多谜团。历史上的谜团拥有最多...
    怪鸭帆阅读 5,578评论 0 5

友情链接更多精彩内容