實現(xiàn)思路
1.通過runtime獲取對象的所有屬性
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
2.遍歷所有屬性通過kvc賦值(難點:多層自定義類的轉換)
3.沒了
創(chuàng)建類別:
NSObject+HYModel.h
NSObject+HYModel.h
.h
/**字典轉模型*/
+ (id)hy_modelWithDictionary:(NSDictionary *)dic;
/**json轉模型*/
+ (id)hy_modelWithJSON:(NSDictionary *)dic;
.m
/**字典轉模型*/
+ (id)hy_modelWithDictionary:(NSDictionary *)dic{
if (!dic || [dic isEqual:[NSNull null]] || ![dic isKindOfClass:[NSDictionary class]]) {
return nil;
}
id model = [[self alloc] init];
NSArray *allProperties = [self getAllProperties];
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([allProperties containsObject:key]) {
//kvc賦值
[model setValue:obj forKey:key];
}
}];
return model;
}
/**json轉模型*/
+ (id)hy_modelWithJSON:(NSString *)json{
NSDictionary *dic = [self dictionaryWithJSON:json];
id model = [[self alloc] init];
model = [self hy_modelWithDictionary:dic];
return model;
}
#pragma mark - 私有方法
/* 通過runtime獲取對象的所有屬性 */
- (NSArray *)getAllProperties{
unsigned int count;
NSMutableArray *allPropertiesArray = [[NSMutableArray alloc]init];
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for (unsigned int i = 0; i < count; i++) {
const char *propertyName = property_getName(propertyList[i]);
[allPropertiesArray addObject:[NSString stringWithUTF8String:propertyName]];
}
//釋放propertyList(C語言)
free(propertyList);
return allPropertiesArray;
}
/*通過rutime獲取對象的類*/
/* json轉模型 */
- (NSDictionary *)dictionaryWithJSON:(id)json {
if (!json || json == (id)kCFNull) return nil;
NSDictionary *dic = nil;
NSData *jsonData = nil;
if ([json isKindOfClass:[NSDictionary class]]) {
dic = json;
} else if ([json isKindOfClass:[NSString class]]) {
jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
} else if ([json isKindOfClass:[NSData class]]) {
jsonData = json;
}
if (jsonData) {
dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
}
return dic;
}