Simple Mapper Implementation

最近简单的了解了下 NSDictionary 转 Model 映射的 runtime 实现。记录如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+(instancetype)mapToModel:(NSDictionary *)bookInfo{
Book *bookModel = [[Book alloc]init];
NSMutableArray *keys = [[NSMutableArray alloc] init];
u_int propertyListCount = 0;
objc_property_t *allProperties = class_copyPropertyList([self class], &propertyListCount);
for (int i = 0; i < propertyListCount; i++) {
objc_property_t eachProperty = allProperties[i];
const char *propertyCString = property_getName(eachProperty);
NSString *propertyName = [NSString stringWithCString:propertyCString encoding:NSUTF8StringEncoding];
[keys addObject:propertyName];
}
free(allProperties);
for (NSString *key in keys) {
if ([bookInfo valueForKey:key]) {
[bookModel setValue:[bookInfo valueForKey:key] forKey:key];
}
}
return bookModel;
}

首先,调用了class_copyPropertyList这个方法来获取这个类的所有属性,其中propertyListCount为属性的总数。其中这个方法返回的数组用objc_property_t *来修饰,表示数组中元素为该类型(C 语言知识)。
随后在遍历数组的过程中,调用property_getName方法将objc_property_t转化成const char *字符串,进而转换成 OC 的 NSString对象存入 keys 数组。
释放已经用过的allProperties数组。
再次遍历 keys 数组,取出对应的类的属性。利用 KVC 将 bookInfo 对应的 object 存入属性中。

显示评论