美文网首页iOS开发
利用RunTime和KVC实现模型转换

利用RunTime和KVC实现模型转换

作者: 神奇李白 | 来源:发表于2020-05-28 18:00 被阅读0次

实现思路

1.通过runtime获取对象的所有属性

objc_property_t *propertyList = class_copyPropertyList([self class], &count);

2.遍历所有属性通过kvc赋值(难点:多层自定义类的转换)

3.没了

创建类别:
NSObject+HYModel.h
NSObject+HYModel.h

.h

/**字典转模型*/
+ (id)hy_modelWithDictionary:(NSDictionary *)dic;
/**json转模型*/
+ (id)hy_modelWithJSON:(NSDictionary *)dic;

.m

/**字典转模型*/
+ (id)hy_modelWithDictionary:(NSDictionary *)dic{
    if (!dic || [dic isEqual:[NSNull null]] || ![dic isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    id model = [[self alloc] init];
    NSArray *allProperties = [self getAllProperties];
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([allProperties containsObject:key]) {
            //kvc赋值
            [model setValue:obj forKey:key];
        }
    }];
    return model;
}

/**json转模型*/
+ (id)hy_modelWithJSON:(NSString *)json{
    NSDictionary *dic = [self dictionaryWithJSON:json];
    id model = [[self alloc] init];
    model = [self hy_modelWithDictionary:dic];
    return model;
}


#pragma mark - 私有方法
/* 通过runtime获取对象的所有属性 */
- (NSArray *)getAllProperties{
    unsigned int count;
    NSMutableArray *allPropertiesArray = [[NSMutableArray alloc]init];
    objc_property_t *propertyList = class_copyPropertyList([self class], &count);
    for (unsigned int i = 0; i < count; i++) {
        const char *propertyName = property_getName(propertyList[i]);
        [allPropertiesArray addObject:[NSString stringWithUTF8String:propertyName]];
    }
    //释放propertyList(C语言)
    free(propertyList);
    return allPropertiesArray;
}

/*通过rutime获取对象的类*/

/* json转模型 */
- (NSDictionary *)dictionaryWithJSON:(id)json {
    if (!json || json == (id)kCFNull) return nil;
    NSDictionary *dic = nil;
    NSData *jsonData = nil;
    if ([json isKindOfClass:[NSDictionary class]]) {
        dic = json;
    } else if ([json isKindOfClass:[NSString class]]) {
        jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
    } else if ([json isKindOfClass:[NSData class]]) {
        jsonData = json;
    }
    if (jsonData) {
        dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
        if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
    }
    return dic;
}

相关文章

  • 利用RunTime和KVC实现模型转换

    实现思路 1.通过runtime获取对象的所有属性 objc_property_t *propertyList =...

  • Runtime 的一些用法

    一. 字典转模型 利用Runtime遍历所有的属性或者成员变量利用KVC设值 二. 设置和获取成员变量的值 obj...

  • KVC简单使用

    1、KVC使用 2、key 和 keyPath 区别 3、获取所有同属性的值 4、利用KVC将字典数据转换为模型s...

  • KVC

    KVC应用场景有哪些 动态地取值和设值 利用KVC来访问、修改对象和字典之间的转换 model和字典之间转换 实现...

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • 自动生成属性的模型

    利用 KVC 实现的自动生成属性的模型 调用下面的方法 在输出控制台输出属性模型, 利用kvc 属性名字与字典的 ...

  • runtime 在逆向中的使用

    在逆向工程中,利用runtime可以动态获取类和属性,绑定属性,替换方法的实现。 KVC 可以通过直接获取类的私有...

  • 14-Swift中字典转模型

    字典转模型(初始化时传入字典) 字典转模型(利用KVC转化) 一、 普通的字典转模型: 二、利用KVC字典转模型:

  • 获取控件私有属性并修改

    原理:利用runtime访问控件的私有属性,然后利用KVC修改私有属性

  • runtime简单使用

    将字典转化为模型,面向模型开发,是在开发中最为常用的功能。利用KVC可以将字典转换为模型,但是前提有三个约束,一个...

网友评论

    本文标题:利用RunTime和KVC实现模型转换

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