Board logo

标题: RunTime(4) [打印本页]

作者: look_w    时间: 2019-3-3 19:49     标题: RunTime(4)

字典转模型

重中之重!
好多解析model 的框架底层原理都是基于runtime

1.动态添加属性代码

    {
        "classNum": "3年二班",
        "user": [
                 {"name":"张三"
                 "age":22
                 },
                 {"name":"李四"
                 "age":34
                 },
                 ]
        "isHave":YES
        "totol":2
    }

建一个NSDictionary 分类

    - (void)createPropertyWithDict{
        NSMutableString *string = [NSMutableString string];
     
        [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            
            
            if ([obj isKindOfClass:[NSString class]]) {
                NSString* str = [NSString stringWithFormat"@property (nonatomic,strong) NSString *%@;",key];
                [string appendFormat"\n%@\n",str];
            }else if ([obj isKindOfClass:[NSArray class]]){
                NSString* str = [NSString stringWithFormat"@property (nonatomic,strong) NSArray *%@;",key];
                [string appendFormat"\n%@\n",str];
     
            }else if ([obj isKindOfClass:[NSDictionary class]]){
                NSString* str = [NSString stringWithFormat"@property (nonatomic,strong) NSDictionary *%@;",key];
                [string appendFormat"\n%@\n",str];
     
            }else if ([obj isKindOfClass:NSClassFromString(@"__NSCFBoolean")]){
                NSString* str = [NSString stringWithFormat"@property (nonatomic,assign) BOOL %@;",key];
                [string appendFormat"\n%@\n",str];
     
            }else if ([obj isKindOfClass:[NSNumber class]]){
                NSString* str = [NSString stringWithFormat"@property (nonatomic,assign) NSInteger %@;",key];
                [string appendFormat"\n%@\n",str];
            }
     
        }];
        
        NSLog(@"%@",string);
     
    }

然后用字典直接调用createPropertyWithDict
得到结果如下

    @property (nonatomic,assign) NSInteger totole;
     
    @property (nonatomic,strong) NSString * classNum;
     
    @property (nonatomic,assign) BOOL isHave;
     
    @property (nonatomic,strong) NSArray *user;
     

2.字典转model

    - (id)modelWithDictNSDictionary*)dict{
        NSObject *obj = [[[self class] alloc] init];
        unsigned int count = 0;
        //之所以用class_copyIvarList 而不用 class_copyPropertyList,因为我们可能忽略成员变量,但不会忽略属性
        Ivar *IvalList = class_copyIvarList([self class], &count);
        for (int i = 0; i<count; i++) {
            Ivar ivar = IvalList[i];
            //ivar_getName(ivar) 得到成员变量的名字
            //c语言字符串转oc字符串转
            NSString *ivarStr = [NSString stringWithUTF8String:ivar_getName(ivar)];
            ivarStr = [ivarStr substringFromIndex:1];
            //ivar_getTypeEncoding(ivar) 得到成员变量的类型
            NSString *ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
            ivarType = [ivarType stringByReplacingOccurrencesOfString:@"@" withString:@""];
            ivarType = [ivarType stringByReplacingOccurrencesOfString:@"\"" withString:@""];
     
            [obj setValue:dict[ivarStr] forKey:ivarStr];
        }
        
        return obj;
    }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0