一个类的其中一个属性是另一个类,setValuesForKeysWithDictionary是怎么工作的?

1.City类里面有一个Coord类的属性,还有一些其他属性,Coord里面有两个property。
当调用initWithDictionary给Coord里面的属性赋值的时候我知道发生了什么,但是当City里面还有一个含有两个属性的属性时候init是怎么赋值的?囧rz 我是一个小白,感觉说的不是很明白。

  • (void)setValue:(id)value forKey:(NSString *)key

{

if ([value isKindOfClass:[NSNull class]]) {
    return;
}
        
if ([key isEqualToString:@"city"]) {
    value = [[City alloc] initWithDictionary:value];
}
        
[super setValue:value forKey:key];//还有为什么这里在if之外?
    
    

}

  • (instancetype)initWithDictionary:(NSDictionary *)dictionary
    {
    if ([dictionary isKindOfClass:[NSDictionary class]]) {

       self = [super init];
       if (self) {
           [self setValuesForKeysWithDictionary:dictionary];
       }
       return self;

    } else {

       return nil;

    }
    }

阅读 4k
3 个回答

-(void)setValue:(id)value forKey:(NSString *)key 这个方法是对系统KVC方法的重写,如果keycityvalue转成City对象再用系统默认的方法setValue:forKey:,key不是city时直接setValue:forKey:

有点像java中的反射机制,就是根据字典中的key,查找对应的属性,如果属性存在,则给属性赋值对应的属性值key:value;
实现代码就是

- (void)my_setValuesAndKeysFromDict:(NSDictionary *)dict
{
    for (NSString *key in dict) {
        [self my_setValue:dict[key] forKey:key];
    }
}

首先分析一下楼主的数据存储方法,通过上面的方法可以看出,数据是这样存储的{@"key":value, @"city":{@"key1":value1,@"key2":value2}...} city 字段存储的并不是 city 对象而是其所需数据字典
所以当key==city 时,value 对应的不是 city 对象,需要通过数据字典创建对象,在赋值,楼主问为什么会在 if 之外,if 是用来处理数据的,只有当数据处理完之后才能赋值,所以在外面

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题