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 <objc/runtime.h>
@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啊。
网友评论