美文网首页
试用分类(Category)扩展属性,也叫动态添加属性

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

作者: Sax_Frank | 来源:发表于2016-05-18 20:33 被阅读1290次

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啊。

相关文章

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

    PS:首先我想声明一下,该标题包含了两层意思,这也是我接下来要写的两个部分。 一.在某一个类中增加属性 场景如下:...

  • 分类的关联属性

    类扩展和分类的区别 category:就是类别,也叫分类,专门用来给类添加新的方法,不能给类添加成员属性,但可以使...

  • 类的加载(三)

    类扩展 类扩展 VS 分类 category 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也...

  • category添加属性

    category中添加属性不会生成成员变量,也不会自动生成set和get方法;如果想动态为分类添加属性,需要使用运...

  • iOS底层学习:类的扩展和关联对象

    类的扩展和分类 category:分类、类别 给类增加方法 不能添加成员变量 可以使用runtime给分类添加属性...

  • iOS类别、继承、扩展

    iOS类别(也叫分类):一般扩展本类的方法,可以添加属性,不能自动生成setter、getter方法;使用的是动态...

  • runtime的实际应用

    1、使用关联对象动态给分类添加属性 使用关联对象,可以为类添加Category中的属性,我们可以为现有类添加一些实...

  • 十四、关联对象

    分类与类扩展 category∶类别,分类 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也无法...

  • 类 *分类* 类扩展

    分类:Category iOS中的分类主要的作用就是为类提供扩展,增加一些方法。但是只能添加方法 不能添加属性?我...

  • 14、关联对象的分析

    一、 先说说类的扩展 与 分类 category /分类:不能给类添加成员属性,专门用来给类添加新的方法注:可以通...

网友评论

      本文标题:试用分类(Category)扩展属性,也叫动态添加属性

      本文链接:https://www.haomeiwen.com/subject/vpvwrttx.html