利用RunTime和KVC實現(xiàn)模型轉換

實現(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;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容