让对象伪装成一个字典

奇技淫巧 指过于奇巧而无益的技艺与制品. 转载请注明出处 uxyheaven csdn博客 其实这个技巧特定情况下,要求不高还挺是有用的.

我们原本有个接口1,设计的….,为了灵活性嘛,就用了字典

– (void)method1:(NSDictionary *)dic{NSString *name = dic[@”name”];NSLog(@”%s, name: %@”,__FUNCTION__, name);}

等到我们水平提高了,发现代码应该这么写

@protocol protocol <NSObject>- (NSString *)name;@end- (void)method2:(id <protocol>)objc{NSString *name = objc.name;NSLog(@”%s, name: %@”,__FUNCTION__, name);}

那么问题就来了,method1已经被你不知道用了多少个地方了,怎样改动成本最小呢? 我们可以将一个对象伪装成一个字典

: NSObject@property (nonatomic, copy) NSString *name;@endAS_PretendDictionary(NormalEntity)@endDEF_PretendDictionary(NormalEntity);<NSObject>- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;- (id)objectForKeyedSubscript:(id)key;(PretendDictionary) \- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; \- (id)objectForKeyedSubscript:(id)key; \(PretendDictionary) \- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key \{ [self setValue:obj forKeyPath:(NSString *)key]; } \- (id)objectForKeyedSubscript:(id)key \{ return [self valueForKeyPath:key]; } \@end

用的时候就可以直接当他是个字典了

NormalEntity *bb = [[NormalEntity alloc] init];bb[@”name”] = @”aaa”;[self method1:(NSDictionary *)bb];

当然了这个和真的字典还是有区别的,只能get 和set,不然也不会在这个系列里了. demo可以在这里下载

,把自己当傻瓜,不懂就问,你会学的更多

让对象伪装成一个字典

相关文章:

你感兴趣的文章:

标签云: