runtime 字典转model

想着归档,想着model,突然想到其实我们平常字典转model 的需求其实是更常见的,因此此处也继续笔记下。

依然是先从最原始的字典转model,当然我们有时用 字典快速赋值 是最直接的。

- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues; 

然而有时,我们还是得类似下面这样:

#import <Foundation/Foundation.h>

@interface UserModel : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

- (instancetype)initWithDictionary:(NSDictionary *)dictionary;

@end

#import "UserModel.h"

NSString *const kNameKey = @"name";
NSString *const kAgeKey = @"age";

@implementation UserModel

- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
    self = [super init];
    if (self) {
        self.name = dictionary[kNameKey];
        self.age = [dictionary[kAgeKey] integerValue];
    }
    return self;
}

依然还是那种需求,当属性特别多的时候,我们就可以用 rumtime 进行字典转model 就简化啦

#import <Foundation/Foundation.h>

@interface TestModel : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) NSDictionary * testDic;
@property (nonatomic, strong) NSArray * testArray;

- (instancetype)initWithDictionary:(NSDictionary *)dictionary;

@end

#import "TestModel.h"
#import <objc/runtime.h>
#import <objc/message.h>

@implementation TestModel

- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
    self = [super init];
    if (self) {
        NSMutableArray * keyArray = [NSMutableArray array];
        unsigned  int outCount = 0 ;
        //获取该类的属性列表 class_copyPropertyList
        objc_property_t * propertys = class_copyPropertyList([self  class], &outCount);
        
        for (int i = 0 ; i < outCount; i++) {
            objc_property_t    property =  propertys[i];
            //获取属性对应的名称 property_getName
            NSString * propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
            [keyArray addObject:propertyName];
        }
        //记得要释放
        free(propertys);
        
        for (NSString * key in keyArray) {
            NSArray * keyArray = [dictionary allKeys];
            // 先做一个判断
            if (![keyArray containsObject:key]||[dictionary valueForKey:key] == nil) {
                continue ;
            }
            [self setValue:[dictionary valueForKey:key] forKey:key];
        }
    }
    return self;
}

经过测试是OK的

NSDictionary *testReusltDic = @{@"name":@"Yang",
                                    @"age":@"6",
                                    @"testArray":@[@"1",@"2"],
                                    @"testDic":@{@"one":@"1",@"two":@"2"}};
TestModel * model = [[TestModel alloc] initWithDictionary:testReusltDic];
NSLog(@"name ==== %@, age == %ld, testDic===%@, testArray === %@",model.name,model.age,model.testDic,model.testArray);
// output: name ==== Yang, age == 6, testDic==={one = 1;two = 2;}, testArray === (1, 2)

当然model 也可以通过runtime 转换成字典的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,697评论 7 64
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,464评论 25 707
  • 一、专业分析 本人目前研究生阶段的专业是信息与通信工程。该专业是一个基础知识面宽、应用领域广阔的综合性专业,涉及无...
    波塞冬的鱼阅读 2,574评论 14 42
  • 《醒来,睡去》 醒来再次睡去就是这么自由 有人说有人问这算不算自由 想着你想着你每天总要几次 重复着重复着醒来再次...
    葉威阅读 340评论 0 3
  • 今天跟随集团的几位老师一起外出学习,大家凑在一起坐卧铺,有说有笑很热闹,大家在一起交流感觉收获不小。尤其一位老师谈...
    digman阅读 148评论 0 0