码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C 奇巧淫技--让对象伪装成一个字典

时间:2015-04-29 00:42:22      阅读:151      评论:0      收藏:0      [点我收藏+]

标签: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;
@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可以在这里下载

Objective-C 奇巧淫技--让对象伪装成一个字典

标签:ios   设计   接口   

原文地址:http://blog.csdn.net/uxyheaven/article/details/45350159

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!