標籤:ios 設計 介面
奇技淫巧 指過於奇巧而無益的技藝與製品.
轉載請註明出處 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;@endAS_PretendDictionary(NormalEntity)// .m@implementation NormalEntity@endDEF_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可以在這裡下載
Objective-C 奇巧淫技--讓對象偽裝成一個字典