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;
}
}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
-(void)setValue:(id)value forKey:(NSString *)key这个方法是对系统KVC方法的重写,如果key为city,value转成City对象再用系统默认的方法setValue:forKey:,key不是city时直接setValue:forKey:。有点像java中的反射机制,就是根据字典中的key,查找对应的属性,如果属性存在,则给属性赋值对应的属性值key:value;
实现代码就是
首先分析一下楼主的数据存储方法,通过上面的方法可以看出,数据是这样存储的{@"key":value, @"city":{@"key1":value1,@"key2":value2}...} city 字段存储的并不是 city 对象而是其所需数据字典
所以当key==city 时,value 对应的不是 city 对象,需要通过数据字典创建对象,在赋值,楼主问为什么会在 if 之外,if 是用来处理数据的,只有当数据处理完之后才能赋值,所以在外面