免费开源的iOS开发学习平台

KVC介绍:2 - setValuesForKeysWithDictionary字典转模型

KVC除了最简单的对对象属性进行赋值和取值外,在NSKeyValueCoding类中,还提供了setValuesForKeysWithDictionary方法,该方法专门用于把一个字典转换成一个模型对象,但使用过程中要求字典中的键值和类中定义的属性名称必须完全一致。假如有不一致的情况,就需要在类的实现文件中,对名称不一致的键值需要使用setValue:forUndefinedKey:方法进行特殊处理。

- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;

下面的示例代码中,演示了如何使用KVC把一个字典对象转换成一个模型对象。如下所示是一个字典对象,在该字典对象中有3个键值对。

NSDictionary *dict = @{
                               @"id" : @1234567,
                               @"name" : @"99iOS",
                               @"age" : @2
                               };

然后,新建一个Person类,在Person.h文件中添加idNumbernameage3个属性,如下所示。注意,在字典中的键值名称与类的属性名称并不完全一一对应,在字典中的id键对应idNumber属性。

@interface Person : NSObject
@property(nonatomic, copy) NSString *idNumber;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@end

在Person.m文件中,需要使用setValue:forUndefinedKey:方法对idNumber属性的赋值方法进行特殊处理,即字典中的id键值对的value需要赋值给idNumber属性。

- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
    if ([key isEqualToString:@"id"]) {
        self.idNumber = (NSString *)value;
    }
}

在main()函数中,我们使用setValuesForKeysWithDictionary:方法来把一个字典转换成一个Person类的模型对象。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSDictionary *dict = @{
                               @"id" : @1234567,
                               @"name" : @"99iOS",
                               @"age" : @2
                               };
        Person *person = [[Person alloc] init];
        [person setValuesForKeysWithDictionary:dict];
        NSLog(@"idNumber:%@", person.idNumber);
        NSLog(@"name:%@", person.name);
        NSLog(@"age:%d", person.age);
    }
    return 0;
}

运行结果如下:

示例代码

https://github.com/99ios/5.4.2