Runtime 字典转模型

  1. 创建BaseModel类
  • 在.m文件中
#import "BaseModel.h"
#import 
#import 


@implementation BaseModel


+ (instancetype)modelWithDict:(NSDictionary*)dict{
    
    // 1.创建对应的对象
    
    id objc = [[self alloc] init];
    
    // 2.利用runtime给对象中的属性赋值
    
    /**
     
         class_copyIvarList: 获取类中的所有成员变量
     
         Ivar:成员变量
     
         第一个参数:表示获取哪个类中的成员变量
     
         第二个参数:表示这个类有多少成员变量,传入一个Int变量地址,会自动给这个变量赋值
     
         返回值Ivar *:指的是一个ivar数组,会把所有成员属性放在一个数组中,通过返回的数组就能全部获取到。
     
         count: 成员变量个数
     
     */
    
    unsigned int count =0;
    
    // 获取类中的所有成员变量
    
    Ivar *ivarList = class_copyIvarList(self, &count);
    
    // 遍历所有成员变量
    
    for(int i =0; i < count; i++)
    {
        
        // 根据角标,从数组取出对应的成员变量
        
        Ivar ivar = ivarList[i];
        
        // 获取成员变量名字
        
        NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
        
        // 处理成员变量名->字典中的key(去掉 _ ,从第一个角标开始截取)
        
        NSString *key = [ivarName substringFromIndex:1];
        
        // 根据成员属性名去字典中查找对应的value
        
        id value = dict[key];
        
        // 【如果模型属性数量大于字典键值对数理,模型属性会被赋值为nil】
        
        // 而报错 (could not set nil as the value for the key age.)
        
        if(value) {
            
            // 给模型中属性赋值
            [objc setValue:value forKey:key];
            
        }
        
    }
    
    return objc;
    
}


@end

2.创建的person子类集成BaseModel

#import 
#import "BaseModel.h"

@interface Person : BaseModel

@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *address;
@property(nonatomic,strong)NSNumber *height;
@property(nonatomic,strong)NSNumber *age;
@property(nonatomic,copy)NSString *idString;

@end

3.调用

 NSDictionary *dic = @{
                          @"name":@"xingweixin",
                          @"address":@"daxing",
                          @"age":[NSNumber numberWithFloat:15],
                          @"height":[NSNumber numberWithInteger:173],
                          @"id":@"yuuyu"
                          
                          };
    
    Person *p = [Person modelWithDict:dic];

注 : 如果Dic中的Count少于Person类属性,则Persion类中为nil

问题

  • 如果字典中出现敏感字段(如id),则在Person.m类中做一下处理
#import "Person.h"

@implementation Person


+ (instancetype)modelWithDict:(NSDictionary*)dict{
    
   Person *objc = (Person *)[super modelWithDict:dict];
    
    objc.idString = [dict objectForKey:@"id"];
    
    return objc;
    
}


@end

你可能感兴趣的:(Runtime 字典转模型)