PS:首先我想聲明一下憾股,該標(biāo)題包含了兩層意思环葵,這也是我接下來要寫的兩個部分。
一.在某一個類中增加屬性
場景如下:比如我正在使用別人寫的IMSDK,里面有個類(IMUser),該類有屬性:jid郭蕉、userID劝赔、userName,他們都做了數(shù)據(jù)庫存儲操作瓜贾。但是假如他這3個屬性滿足不了我诺祸,我還需要一個屬性isSelected,用來判斷是否選中該用戶祭芦,而且是不需要存入數(shù)據(jù)庫的筷笨。那么,這時候我就可以寫一個分類來擴(kuò)展這么一個屬性。
.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
以上使用了運(yùn)行時機(jī)制胃夏,而且擴(kuò)展的屬性是屬于IMUser的轴或。
二.在某一個類的擴(kuò)展某一個屬性
其實以下這點主要講對字典屬性的擴(kuò)展,假如你是用IMSDK构订,不過慶幸的是IMSDK的維護(hù)者他眼光長遠(yuǎn)侮叮,知道你也許會想要自己的屬性,這時候他就在IMUser這個類中給了一個屬性
//用戶屬性擴(kuò)展字段
@property(nonatomic,strong) NSMutableDictionary *userExt;
以上第一點講到的是他該類做了數(shù)據(jù)存儲操作悼瘾,而且我用到的字段不需要存儲數(shù)據(jù)庫囊榜,所以用了第一種運(yùn)行時機(jī)制,但是現(xiàn)在我要用到一個屬性叫做email亥宿,而且是需要存儲到數(shù)據(jù)庫的卸勺。那我是不是可以把它加到userExt[@"email"]中呢?但問題是我每次用到都要這樣取值烫扼,如下:
IMUser *user = [IMUser alloc] init];
NSString *email = user.userExt[@"email"];
假如我想做到取值如下:
IMUser *user = [IMUser alloc] init];
NSString *email = user.email;
這樣是不是更方便曙求,好,那就說說怎么對userExt進(jìn)行改造
.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啊。