試用分類(Category)擴(kuò)展屬性,也叫動(dòng)態(tài)添加屬性

PS:首先我想聲明一下,該標(biāo)題包含了兩層意思,這也是我接下來要寫的兩個(gè)部分。

一.在某一個(gè)類中增加屬性

場景如下:比如我正在使用別人寫的IMSDK,里面有個(gè)類(IMUser),該類有屬性:jid、userID、userName,他們都做了數(shù)據(jù)庫存儲(chǔ)操作。但是假如他這3個(gè)屬性滿足不了我,我還需要一個(gè)屬性isSelected,用來判斷是否選中該用戶,而且是不需要存入數(shù)據(jù)庫的。那么,這時(shí)候我就可以寫一個(gè)分類來擴(kuò)展這么一個(gè)屬性。

.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)行時(shí)機(jī)制,而且擴(kuò)展的屬性是屬于IMUser的。

二.在某一個(gè)類的擴(kuò)展某一個(gè)屬性

其實(shí)以下這點(diǎn)主要講對字典屬性的擴(kuò)展,假如你是用IMSDK,不過慶幸的是IMSDK的維護(hù)者他眼光長遠(yuǎn),知道你也許會(huì)想要自己的屬性,這時(shí)候他就在IMUser這個(gè)類中給了一個(gè)屬性

//用戶屬性擴(kuò)展字段
@property(nonatomic,strong) NSMutableDictionary *userExt;

以上第一點(diǎn)講到的是他該類做了數(shù)據(jù)存儲(chǔ)操作,而且我用到的字段不需要存儲(chǔ)數(shù)據(jù)庫,所以用了第一種運(yùn)行時(shí)機(jī)制,但是現(xiàn)在我要用到一個(gè)屬性叫做email,而且是需要存儲(chǔ)到數(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啊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容