奇技淫巧 指过于奇巧而无益的技艺与制品.
转载请注明出处 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已经被你不知道用了多少个地方了,怎样改动成本最小呢?
我们可以将一个对象伪装成一个字典
// .h
@interface NormalEntity : NSObject
@property (nonatomic, copy) NSString *name;
@end
AS_PretendDictionary(NormalEntity)
// .m
@implementation NormalEntity
@end
DEF_PretendDictionary(NormalEntity);
// core
@protocol PretendDictionaryProtocol<NSObject>
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
- (id)objectForKeyedSubscript:(id)key;
@end
#define AS_PretendDictionary(__class) \
@interface __class (PretendDictionary) \
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; - (id)objectForKeyedSubscript:(id)key; @end
#define DEF_PretendDictionary(__class) \
@implementation __class (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可以在这里下载
原文地址:http://blog.csdn.net/uxyheaven/article/details/45350159