试用分类(Category)扩展属性,也叫动态添加属性

PS:首先我想声明一下,该标题包含了两层意思,这也是我接下来要写的两个部分。

一.在某一个类中增加属性

场景如下:比如我正在使用别人写的IMSDK,里面有个类(IMUser),该类有属性:jid、userID、userName,他们都做了数据库存储操作。但是假如他这3个属性满足不了我,我还需要一个属性isSelected,用来判断是否选中该用户,而且是不需要存入数据库的。那么,这时候我就可以写一个分类来扩展这么一个属性。

.h文件中

#import "IMUser.h"

@interface IMUser(IMUserExt)
@property(nonatomic,assign) BOOL isSelected;

@end

.m文件中

#import "IMUserExt.h"
#import 

@implementation IMUser(IMUserExt)

static const char *strIsSelectedKey = "strIsSelectedKey";

-(void)setIsSelected:(BOOL)isSelected
{
objc_setAssociatedObject(self, strIsSelectedKey, @(isSelected), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(BOOL)isSelectedf
{
NSNumber *number = objc_getAssociatedObject(self, strIsSelectedKey);;
return  [number boolValue];
}

@end

以上使用了运行时机制,而且扩展的属性是属于IMUser的。

二.在某一个类的扩展某一个属性

其实以下这点主要讲对字典属性的扩展,假如你是用IMSDK,不过庆幸的是IMSDK的维护者他眼光长远,知道你也许会想要自己的属性,这时候他就在IMUser这个类中给了一个属性

//用户属性扩展字段
@property(nonatomic,strong) NSMutableDictionary *userExt;

以上第一点讲到的是他该类做了数据存储操作,而且我用到的字段不需要存储数据库,所以用了第一种运行时机制,但是现在我要用到一个属性叫做email,而且是需要存储到数据库的。那我是不是可以把它加到userExt[@"email"]中呢?但问题是我每次用到都要这样取值,如下:

IMUser *user = [IMUser alloc] init];
NSString *email = user.userExt[@"email"];

假如我想做到取值如下:

IMUser *user = [IMUser alloc] init];
NSString *email = user.email;

这样是不是更方便,好,那就说说怎么对userExt进行改造

.h文件

#import "IMUser.h"

@interface IMUser(IMUserExt)
@property(nonatomic,copy) NSString *email;

@end

.m文件

#import "IMUserExt.h"

@implementation TKIMUser(TKIMUserExt)

-(void)setEmail:(NSString *)email
{
    self.userExt[@"email"] = email;
}


-(NSString *)email
{
    return self.userExt[@"email"];
}

@end

重写该属性的setter和getter方法就可以了,是不是这么简单,好high啊。

你可能感兴趣的:(试用分类(Category)扩展属性,也叫动态添加属性)