IOS自动获取类的所有属性存入字典以及从字典中给类的属性自动赋值
在做IOS开发的时候,有时需要将Dictionary对象转换为对应的实体类,例如做Json解析的时候,一般会先使用NSJSONSerialization将Json字符串解析成NSDictionary对象,然后使用NSObject的方法setValuesForKeysWithDictionary将NSDictionary解析为实体对象,这里提供另一种方法实现setValuesForKeysWithDictionary的功能:
unsigned int count;
objc_property_t* props = class_copyPropertyList(class, &count);
for (int i = 0; i < count; i++) {
objc_property_t property = props[i];
NSString *name = @(property_getName(property));
id object = [dict objectForKey:name];
if (object != nil) { // 如果字典中存储了该属性
NSString *attrs = @(property_getAttributes(property));
[self setValue:object forKey:name];
}
}
free(props);
然后是反向操作,获取实体类的属性存入字典:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
unsigned int count;
objc_property_t *properties = class_copyPropertyList(class, &count);
for (int i = 0; i < count; i++) {
objc_property_t property = properties[i];
NSString *name = @(property_getName(property));
id value = [self valueForKey:name];
if (value) {
[dict setObject:value forKey:name];
}
}
free(properties);
利用这两个方法结合NSJSONSerialization可以实现一个简单的Json库,当然这只是最简单的情况,对不能存入字典的属性还需做转换,另外还要处理父类的属性(可以先获取父类的class对象class_getSuperclass(class),然后用同样的方法处理)。