试用分类(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 <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啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容