一、源码篇:MJExtension 简单的字典转模型

博客主要介绍了MJExtension框架如何高效地将字典转换为模型,重点讨论了objectWithKeyValues方法及其内部结构,包括模型属性与字典键值的一致性要求,以及源码中的关键函数和步骤。
摘要由CSDN通过智能技术生成


MJExtension是一个高效率的将字典转换成模型的三方框架,当然这里也可将包括模型转字典;

同时,内部也有将CoreData和归档产生的文件转换成模型;

作者水平有限,这里仅从最简单的字典转模型讨论;

1、根据MJ提供的示例剖析内部的结构,看代码:

// 1.定义一个字典
    NSDictionary *dict = @{
                           @"name" : @"Jack",
                           @"icon" : @"lufy.png",
                           @"age" : @20,
                           @"height" : @1.55,
                           @"money" : @"100.9",
                           @"sex" : @(SexFemale),
//                           @"gay" : @"1"
//                           @"gay" : @"NO"
                           @"gay" : @"true"
                           };

    // 2.将字典转为User模型
    User *user = [User objectWithKeyValues:dict];

    // 3.打印User模型的属性
    NSLog(@"name=%@, icon=%@, age=%d, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay);

MJExtension提供NSObject的类方法,模型可直接调用objectWithKeyValues方法,内部根据模型的属性直接将字典转化成模型,这里模型的名称必须要和字典中key的名称保持一致;

2、按住command点击左键,一路看到很多函数的调用,其中这里比较难理解:

- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error
{
    // 如果是JSON字符串
    if ([keyValues isKindOfClass:[NSString class]]) {
        keyValues = [((NSString *)keyValues) JSONObject];
    }
    
    MJAssertError([keyValues isKindOfClass:[NSDictionary class]], self, error, @"keyValues参数不是一个字典");
    
    @try {
        //获取该对象的所有属性 ???
        NSArray *ignoredPropertyNames = [[self class] totalIgnoredPropertyNames];
        MJLog(@"ignoredPropertyNames->%@",ignoredPropertyNames);
        [[self class] enumeratePropertiesWithBlock:^(MJProperty *property, BOOL *stop) {
            // 0.检测是否被忽略
            if ([ignoredPropertyNames containsObject:property.name]) return;
            
            // 1.取出属性值
            id value = keyValues ;
            NSArray *keys = [property keysFromClass:[self class]];
            for (NSString *key in keys) {
                if (![value isKindOfClass:[NSDictionary class]]) continue;
                value = value[key];
            }
            if (!value || value == [NSNull null]) return;
            
            // 2.如果是模型属性
            MJType *type = property.type;
            Class typeClass = type.typeClass;
            Class objectCla
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值