文档章节

第02天实战技术(02):KVC字典转模型

宇鸿165
 宇鸿165
发布于 2017/03/25 16:53
字数 661
阅读 5
收藏 0

#####一、字典转模型的方式 需求 : 模型只保存最重要的数据,导致模型的属性 和 字典不能一一对应(不能使用kvc了)

  • 1.最原始的方法

+ (instancetype)modelWithDict:(NSDictionary *)dict
{
    StatusModel *model = [[StatusModel alloc]init];
#pragma mark 0.不使用kvc (最原始的方法)
    // 拿到每一个模型的属性,去字典中取出对应的值,给对应的值进行赋值
    // 从字典中取值,不一定要全部取出来
    model.pic_urls = dict[@"pic_urls"];
    model.text = dict[@"text"];
    return model;
}
  • 2.KVC实现
>>> 1语句实现
+ (instancetype)modelWithDict:(NSDictionary *)dict
{
    StatusModel *model = [[StatusModel alloc]init];
#pragma mark 1.KVC
    // KVC : 把字典中所有值给模型的属性赋值
    [model setValuesForKeysWithDictionary:dict];
    return model;
}    

#pragma 重写setValue forUndefinedKey 那么就可以使用KVC
// 重写系统方法 ? 1.想给系统的方法添加额外的功能 2.不想要系统方法实现
// 系统找不到 就会调用这个方法 , 报错
/**
 '[<StatusModel 0x6100000928e0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key source.'
 */
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}    
  • 3KVC底层实现原理
// 模型只保存最重要的数据,导致模型的属性 和 字典不能一一对应(不能使用kvc了)

+ (instancetype)modelWithDict:(NSDictionary *)dict
{
    StatusModel *model = [[StatusModel alloc]init];    
#pragma mark 2.KVC底层实现原理1
    // KVC的底层实现原理
    // 1. 遍历字典中有的key, 取模型中查找 有没有对应的属性(同名的)
    [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        // 2. 去模型中有没有 对应的一个属性名 KVC
        [model setValue:obj forKey:key]; // 系统在去调用KVC方法
        // key : soucre value : 来自微博 weibo.com
        // [model setValue:@"来自微博 weibo.com" forKey:key];

    }];

    return model;
}

#pragma mark 2.KVC底层实现原理2

/*
    [model setValue:@"来自微博 weibo.com" forKey:@"source"];
    1. 首先去模型中 有没有 setSource, 找到,直接调用赋值 (调用set方法)
    2. 去模型中查找有没有source属性,直接访问属性赋值
    3. 去模型中查找有没有_source属性, 直接访问属性赋值 _soucre = value
    4. 找不到,就会直接报错,
 */

/*
- (void)setSource:(NSString *)source
{
    _source = source;
    
}
 */


#pragma 重写setValue forUndefinedKey 那么就可以使用KVC
// 重写系统方法 ? 1.想给系统的方法添加额外的功能 2.不想要系统方法实现
// 系统找不到 就会调用这个方法 , 报错
/**
 '[<StatusModel 0x6100000928e0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key source.'
 */
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    
}
  • 4.第三方框架的使用
MJExtention : 使用技术 1. runtime底层实现字典转模型
(runtime 可以把一个模型中的所有属性遍历出来)与(KVC相反,KVC:是遍历字典中所有的key)

© 著作权归作者所有

宇鸿165
粉丝 1
博文 919
码字总数 368963
作品 0
广州
私信 提问
iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

本文实验Demo传送门:DictToModelDemo 前言:将后台JSON数据中的字典转成本地的模型,我们一般选用部分优秀的第三方框架,如SBJSON、JSONKit、MJExtension、YYModel等。但是,一些简单的数据...

陈满iOS
2018/05/08
0
0
runtime讲解

接着讲runtime的应用,也是最重要的 1.字典转模型 说的字典转模型很多人会想到KVC,然后重写 - (void)setValue:(id)value forUndefinedKey:(NSString *)key方法,为什么要重写呢,因为kvc字典...

刀客445
2016/05/21
50
0
利用runtime实现字典转模型

描述: KVC的字典转模型具有一个缺陷,就是属性的数量与名称都必须保持一致,如果字典中的属性多,而模型中没有使用KVC赋值的时候就会崩溃,需要实现另一个方法 setValue:forUndefinedKey:方...

JlongTian
2016/01/03
60
0
13-Swift中类的构造函数

一 构造函数的介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。 如果是继...

不孤独的美食家
2016/08/15
17
0
类的构造函数

类的构造函数 构造函数的介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。...

别情花如依丶
2016/12/22
2
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部