關(guān)鍵字: runtime 下標(biāo)語法 字典(NSDictionary)
背景
開發(fā)中經(jīng)常遇到要給某個(gè)對象添加的存儲的變量盒使,有時(shí)候不得不寫個(gè)熟悉或增加成員變量,如果是系統(tǒng)或第三方類髓考,還需要繼承或?qū)懛诸惖姆绞綄?shí)現(xiàn)从祝,為了簡便開發(fā)错邦,利用下標(biāo)語法和runtime實(shí)現(xiàn)給所有對象添加類似字典的存儲方式存儲值
具體實(shí)現(xiàn)
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