setValuesForKeysWithDictionary

[转]KVC中setValuesForKeysWithDictionary:

http://m.blog.csdn.net/blog/dragonu013368288/23887063#

2014-4-17阅读203 评论0

从字典映射到一个对象,这是KVC中的一个方法所提供的,这个方法就是 setValuesForKeysWithDictionary: ,非常好用,不需要你来一一的给对象赋值而直接从字典初始化即可,但用的不好会经常崩溃,本教程就来讨论这些使用的细节.

我建立lol的模型

#import <Foundation/Foundation.h>

@interface HeroModel : NSObject



@property (nonatomic,copy) NSString *name;

@property (nonatomic,copy) NSString *intro;

@property (nonatomic,copy) NSString *icon;


- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)heroWithDict:(NSDictionary *)dict;

@end



#import "HeroModel.h"

@implementation HeroModel

- (instancetype)initWithDict:(NSDictionary *)dict
{
    if(self = [super init]){
//                self.icon = [dict[@"icon"] copy];
//                self.name = [dict[@"name"] copy];
//                self.intro = [dict[@"intro"] copy]; //苯方法
        [self setValuesForKeysWithDictionary:dict];

    }
    return self;
}



+ (instancetype)heroWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}

@end




首先,先初始化一个字典,如下所示:


NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                     @"Y.X.",  @"name",
                     @"26",    @"age",
                     @"海淀区", @"address", nil];

创建PersonInfoModel,代码如下所示


import

import “PersonInfoModel.h”

@implementation PersonInfoModel

@end


测试后打印信息如下:

以上是很标准的使用方法,我们再在属性中添加 other,如下图所示:

也没有出错,可以正常使用,也就是说用字典初始化对象时,只要对象中都包含了这些键值,是可以正常初始化的,我们再在字典中添加一个键值对,如下图所示:

直接导致程序崩溃,因为该对象中没有 sex 这个属性,解决方法就是,实现一个方法setValue:forUndefinedKey:,如下图所示:

这样子就会过滤掉给不存在的键值赋值,如果有个属性是id,而id本身就是系统自身关键字,不能够当做属性使用,怎么办?

结论:

setValue:forUndefinedKey:这个方法是关键,只有存在这个方法后,才可以过滤掉不存在的键值对而防止崩溃,同时,setValue:forUndefinedKey:这个方法中还可以改变系统的敏感字,或者,你手动的映射key值不同的值,随你自己喜欢.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值