From 99564bb1160df4b103ea9c93068b7c7015e0afff Mon Sep 17 00:00:00 2001 From: netyouli <712641411@qq.com> Date: Thu, 1 Dec 2016 12:08:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8keyPath=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E5=8F=96=E5=8E=9F=E7=94=9F=E7=B1=BB=E5=9E=8B=E5=80=BC?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E9=94=99=E8=AF=AFbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 40373 -> 40790 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 28 +- Benchmark/ModelBenchmark/Test.json | 64 +++- Benchmark/ModelBenchmark/ViewController.m | 4 +- .../WHC_Model/NSObject+WHC_Model.m | 288 ++++++++--------- README.md | 2 +- WHC_Model.podspec | 4 +- .../UserInterfaceState.xcuserstate | Bin 30549 -> 30571 bytes WHC_ModelKit/NSObject+WHC_Model.m | 290 +++++++++--------- 9 files changed, 364 insertions(+), 316 deletions(-) diff --git a/Benchmark/ModelBenchmark.xcodeproj/project.xcworkspace/xcuserdata/WHC.xcuserdatad/UserInterfaceState.xcuserstate b/Benchmark/ModelBenchmark.xcodeproj/project.xcworkspace/xcuserdata/WHC.xcuserdatad/UserInterfaceState.xcuserstate index 69386edcf4ceb9d24ca76c8d6659f53ff13cc6c3..5a290e6bbb70ae93fb2308a2f652af2fe0ca3606 100644 GIT binary patch literal 40790 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 literal 40373 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 - - - - diff --git a/Benchmark/ModelBenchmark/Test.json b/Benchmark/ModelBenchmark/Test.json index bc15167..9e15b95 100644 --- a/Benchmark/ModelBenchmark/Test.json +++ b/Benchmark/ModelBenchmark/Test.json @@ -1,13 +1,53 @@ { - "status" : { - "msg" : "succ", - "code" : 0 - }, - "data" : [ - "吞天记", - "谢家皇后", - "乱世宏图", - "老婆是武林盟主" - ], - "token" : "" -} \ No newline at end of file + "status": { + "code": 0, + "msg": "succ" + }, + "num": 10, + "cur_page": 1, + "total_num": 1, + "total_page": 10, + "data": [ + { + "value": "3", + "key": "仙侠" + }, + { + "value": "3", + "key": "仙侠传人生路" + }, + { + "value": "3", + "key": "仙侠六界" + }, + { + "value": "3", + "key": "仙侠奇缘之凤千灵" + }, + { + "value": "3", + "key": "仙侠道" + }, + { + "value": "2", + "key": "仙侠一世之神果转世" + }, + { + "value": "2", + "key": "仙侠世界大冒险" + }, + { + "value": "2", + "key": "仙侠之命安彼生" + }, + { + "value": "2", + "key": "仙侠之路" + }, + { + "value": "2", + "key": "仙侠奇缘" + } + ], + "token": "" +} diff --git a/Benchmark/ModelBenchmark/ViewController.m b/Benchmark/ModelBenchmark/ViewController.m index f9fe170..45eefe8 100755 --- a/Benchmark/ModelBenchmark/ViewController.m +++ b/Benchmark/ModelBenchmark/ViewController.m @@ -42,10 +42,10 @@ - (void)viewDidLoad { NSData *data = [NSData dataWithContentsOfFile:path]; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; - NSArray * testArray = [NSString whc_ModelWithJson:json keyPath:@"data"]; + NSArray * testArray = [NSDictionary whc_ModelWithJson:json keyPath:@"data"]; NSLog(@"test = %@",testArray); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - //[self benchmarkGithubUser]; + [self benchmarkGithubUser]; [self benchmarkWeiboStatus]; // [self testRobustness]; diff --git a/Benchmark/ModelBenchmark/WHC_Model/NSObject+WHC_Model.m b/Benchmark/ModelBenchmark/WHC_Model/NSObject+WHC_Model.m index 0d8e9f5..d6f520c 100644 --- a/Benchmark/ModelBenchmark/WHC_Model/NSObject+WHC_Model.m +++ b/Benchmark/ModelBenchmark/WHC_Model/NSObject+WHC_Model.m @@ -714,7 +714,7 @@ + (WHC_ModelPropertyInfo *)classExistProperty:(NSString *)property withObject:(N + (id)handleDataModelEngine:(id)object class:(Class)class { if(object) { if([object isKindOfClass:[NSDictionary class]]) { - NSObject * modelObject = [class new]; + __block NSObject * modelObject = nil; NSDictionary * dictionary = object; __block NSDictionary * replacePropertyNameMap = [class getModelReplacePropertyMapper]; __block NSDictionary * replacePropertyClassMap = [class getModelPropertyClassMapper]; @@ -724,160 +724,172 @@ + (id)handleDataModelEngine:(id)object class:(Class)class { replacePropertyNameMap = [class whc_ModelReplacePropertyMapper]; [class setModelReplacePropertyMapper:replacePropertyNameMap]; } - [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { - NSString * actualProperty = key; - id subObject = obj; - if (replacePropertyNameMap != nil) { - NSString * replaceName = replacePropertyNameMap[actualProperty]; - if (replaceName) { - actualProperty = replaceName; - } - } - WHC_ModelPropertyInfo * propertyInfo = [class getPropertyInfo:actualProperty]; - if (propertyInfo == nil) { - if (replacePropertyClassMap) { - propertyInfo = [WHC_ModelPropertyInfo new]; - [propertyInfo setClass:replacePropertyClassMap[actualProperty] valueClass:[obj class]]; - }else { - if ([class respondsToSelector:@selector(whc_ModelReplacePropertyClassMapper)]) { - [class setModelPropertyClassMapper:[class whc_ModelReplacePropertyClassMapper]]; - } - propertyInfo = [self classExistProperty:actualProperty withObject:modelObject valueClass:[obj class]]; - } - if (propertyInfo) { - [class setModelInfo:propertyInfo property:actualProperty]; + if ([class isSubclassOfClass:[NSDictionary class]]) { + modelObject = [NSMutableDictionary dictionary]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[NSDictionary class]] || [obj isKindOfClass:[NSArray class]]) { + [(NSMutableDictionary *)modelObject setObject:[self handleDataModelEngine:obj class:[obj class]] forKey:key]; }else { - return; + [(NSMutableDictionary *)modelObject setObject:obj forKey:key]; } - SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); - if (![modelObject respondsToSelector:setter]) { - actualProperty = [self existproperty:actualProperty withObject:modelObject]; - if (actualProperty == nil) { - return; + }]; + }else { + modelObject = [class new]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + NSString * actualProperty = key; + id subObject = obj; + if (replacePropertyNameMap != nil) { + NSString * replaceName = replacePropertyNameMap[actualProperty]; + if (replaceName) { + actualProperty = replaceName; } - setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); } - propertyInfo->setter = setter; - } - switch (propertyInfo->type) { - case _Array: - if(![subObject isKindOfClass:[NSNull class]]){ - Class subModelClass = NULL; - if (replaceContainerElementClassMap) { - subModelClass = replaceContainerElementClassMap[actualProperty]; - }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { - replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; - subModelClass = replaceContainerElementClassMap[actualProperty]; - [class setContainerElementClassMapper:replaceContainerElementClassMap]; - } - if (subModelClass == NULL) { - subModelClass = NSClassFromString(actualProperty); - if (subModelClass == nil) { - NSString * first = [actualProperty substringToIndex:1]; - NSString * other = [actualProperty substringFromIndex:1]; - subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); - } + WHC_ModelPropertyInfo * propertyInfo = [class getPropertyInfo:actualProperty]; + if (propertyInfo == nil) { + if (replacePropertyClassMap) { + propertyInfo = [WHC_ModelPropertyInfo new]; + [propertyInfo setClass:replacePropertyClassMap[actualProperty] valueClass:[obj class]]; + }else { + if ([class respondsToSelector:@selector(whc_ModelReplacePropertyClassMapper)]) { + [class setModelPropertyClassMapper:[class whc_ModelReplacePropertyClassMapper]]; } - if (subModelClass) { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:subModelClass]); - }else { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + propertyInfo = [self classExistProperty:actualProperty withObject:modelObject valueClass:[obj class]]; + } + if (propertyInfo) { + [class setModelInfo:propertyInfo property:actualProperty]; + }else { + return; + } + SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); + if (![modelObject respondsToSelector:setter]) { + actualProperty = [self existproperty:actualProperty withObject:modelObject]; + if (actualProperty == nil) { + return; } - - }else{ - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @[]); + setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); } - break; - case _Dictionary: - if(![subObject isKindOfClass:[NSNull class]]){ - Class subModelClass = NULL; - if (replaceContainerElementClassMap) { - subModelClass = replaceContainerElementClassMap[actualProperty]; - }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { - replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + propertyInfo->setter = setter; + } + switch (propertyInfo->type) { + case _Array: + if(![subObject isKindOfClass:[NSNull class]]){ + Class subModelClass = NULL; if (replaceContainerElementClassMap) { subModelClass = replaceContainerElementClassMap[actualProperty]; + }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { + replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + subModelClass = replaceContainerElementClassMap[actualProperty]; [class setContainerElementClassMapper:replaceContainerElementClassMap]; } + if (subModelClass == NULL) { + subModelClass = NSClassFromString(actualProperty); + if (subModelClass == nil) { + NSString * first = [actualProperty substringToIndex:1]; + NSString * other = [actualProperty substringFromIndex:1]; + subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + } + } + if (subModelClass) { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:subModelClass]); + }else { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + + }else{ + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @[]); } - if (subModelClass == NULL) { - subModelClass = NSClassFromString(actualProperty); - if (subModelClass == nil) { - NSString * first = [actualProperty substringToIndex:1]; - NSString * other = [actualProperty substringFromIndex:1]; - subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + break; + case _Dictionary: + if(![subObject isKindOfClass:[NSNull class]]){ + Class subModelClass = NULL; + if (replaceContainerElementClassMap) { + subModelClass = replaceContainerElementClassMap[actualProperty]; + }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { + replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + if (replaceContainerElementClassMap) { + subModelClass = replaceContainerElementClassMap[actualProperty]; + [class setContainerElementClassMapper:replaceContainerElementClassMap]; + } + } + if (subModelClass == NULL) { + subModelClass = NSClassFromString(actualProperty); + if (subModelClass == nil) { + NSString * first = [actualProperty substringToIndex:1]; + NSString * other = [actualProperty substringFromIndex:1]; + subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + } } + if (subModelClass) { + NSMutableDictionary * subObjectDictionary = [NSMutableDictionary dictionary]; + [subObject enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + [subObjectDictionary setObject:[self handleDataModelEngine:obj class:subModelClass] forKey:key]; + }]; + ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObjectDictionary); + }else { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + + }else{ + ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @{}); } - if (subModelClass) { - NSMutableDictionary * subObjectDictionary = [NSMutableDictionary dictionary]; - [subObject enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { - [subObjectDictionary setObject:[self handleDataModelEngine:obj class:subModelClass] forKey:key]; - }]; - ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObjectDictionary); - }else { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + break; + case _String: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + }else{ + ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @""); } - - }else{ - ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @{}); - } - break; - case _String: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - }else{ - ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @""); - } - break; - case _Number: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - }else{ - ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @(0)); - } - break; - case _Integer: - ((void (*)(id, SEL, NSInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject integerValue]); - break; - case _UInteger: - ((void (*)(id, SEL, NSUInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject unsignedIntegerValue]); - break; - case _Boolean: - ((void (*)(id, SEL, BOOL))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject boolValue]); - break; - case _Float: - ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject floatValue]); - break; - case _Double: - ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject doubleValue]); - break; - case _Char: - ((void (*)(id, SEL, char))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject charValue]); - break; - case _Model: - ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:propertyInfo->class]); - break; - case _Date: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSDate *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - } - break; - case _Value: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSValue *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - } - break; - case _Data: { - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSData *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + break; + case _Number: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + }else{ + ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @(0)); + } + break; + case _Integer: + ((void (*)(id, SEL, NSInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject integerValue]); + break; + case _UInteger: + ((void (*)(id, SEL, NSUInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject unsignedIntegerValue]); + break; + case _Boolean: + ((void (*)(id, SEL, BOOL))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject boolValue]); + break; + case _Float: + ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject floatValue]); + break; + case _Double: + ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject doubleValue]); + break; + case _Char: + ((void (*)(id, SEL, char))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject charValue]); + break; + case _Model: + ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:propertyInfo->class]); + break; + case _Date: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSDate *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; + case _Value: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSValue *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; + case _Data: { + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSData *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; } - break; + default: + + break; } - default: - - break; - } - }]; + }]; + } return modelObject; }else if ([object isKindOfClass:[NSArray class]]){ NSMutableArray * modelObjectArr = [NSMutableArray new]; diff --git a/README.md b/README.md index b8c414c..a314caf 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Time lost (Benchmark 1000 times) 集成 ============== * 使用CocoaPods: - - pod 'WHC_Model', '~> 1.6.2' + - pod 'WHC_Model', '~> 1.6.3' * 手工集成: - 导入文件夹WHC_ModelKit diff --git a/WHC_Model.podspec b/WHC_Model.podspec index 091f6e3..3a162d0 100755 --- a/WHC_Model.podspec +++ b/WHC_Model.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "WHC_Model" - s.version = "1.6.2" + s.version = "1.6.3" s.summary = "iOS平台高效转换引擎json->model,model->json,model->Dictionary,支持模型类继承其他模型类,支持指定路径转换,不区分json的key和模型属性名称大小写,自动处理json中null" s.homepage = "https://github.com/netyouli/WHC_Model" @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.platform = :ios s.platform = :ios, "6.0" - s.source = { :git => "https://github.com/netyouli/WHC_Model.git", :tag => "1.6.2"} + s.source = { :git => "https://github.com/netyouli/WHC_Model.git", :tag => "1.6.3"} s.source_files = "WHC_ModelKit/*.{h,m}" diff --git a/WHC_Model.xcodeproj/project.xcworkspace/xcuserdata/WHC.xcuserdatad/UserInterfaceState.xcuserstate b/WHC_Model.xcodeproj/project.xcworkspace/xcuserdata/WHC.xcuserdatad/UserInterfaceState.xcuserstate index bc3f855069dbb9fc0336c90eaad9c7e2da3ffefc..74de8f3c852dc612202229c71347fa44164b5de0 100644 GIT binary patch delta 11355 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 Y6WbqMFO^t0-u=x9?EZf9X?ykm0PT0MsQ>@~ diff --git a/WHC_ModelKit/NSObject+WHC_Model.m b/WHC_ModelKit/NSObject+WHC_Model.m index 5611013..33afa7d 100644 --- a/WHC_ModelKit/NSObject+WHC_Model.m +++ b/WHC_ModelKit/NSObject+WHC_Model.m @@ -721,8 +721,8 @@ + (WHC_ModelPropertyInfo *)classExistProperty:(NSString *)property withObject:(N + (id)handleDataModelEngine:(id)object class:(Class)class { if(object) { - if([object isKindOfClass:[NSDictionary class]]){ - NSObject * modelObject = [class new]; + if([object isKindOfClass:[NSDictionary class]]) { + __block NSObject * modelObject = nil; NSDictionary * dictionary = object; __block NSDictionary * replacePropertyNameMap = [class getModelReplacePropertyMapper]; __block NSDictionary * replacePropertyClassMap = [class getModelPropertyClassMapper]; @@ -732,160 +732,172 @@ + (id)handleDataModelEngine:(id)object class:(Class)class { replacePropertyNameMap = [class whc_ModelReplacePropertyMapper]; [class setModelReplacePropertyMapper:replacePropertyNameMap]; } - [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { - NSString * actualProperty = key; - id subObject = obj; - if (replacePropertyNameMap != nil) { - NSString * replaceName = replacePropertyNameMap[actualProperty]; - if (replaceName) { - actualProperty = replaceName; - } - } - WHC_ModelPropertyInfo * propertyInfo = [class getPropertyInfo:actualProperty]; - if (propertyInfo == nil) { - if (replacePropertyClassMap) { - propertyInfo = [WHC_ModelPropertyInfo new]; - [propertyInfo setClass:replacePropertyClassMap[actualProperty] valueClass:[obj class]]; - }else { - if ([class respondsToSelector:@selector(whc_ModelReplacePropertyClassMapper)]) { - [class setModelPropertyClassMapper:[class whc_ModelReplacePropertyClassMapper]]; - } - propertyInfo = [self classExistProperty:actualProperty withObject:modelObject valueClass:[obj class]]; - } - if (propertyInfo) { - [class setModelInfo:propertyInfo property:actualProperty]; + if ([class isSubclassOfClass:[NSDictionary class]]) { + modelObject = [NSMutableDictionary dictionary]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[NSDictionary class]] || [obj isKindOfClass:[NSArray class]]) { + [(NSMutableDictionary *)modelObject setObject:[self handleDataModelEngine:obj class:[obj class]] forKey:key]; }else { - return; + [(NSMutableDictionary *)modelObject setObject:obj forKey:key]; } - SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); - if (![modelObject respondsToSelector:setter]) { - actualProperty = [self existproperty:actualProperty withObject:modelObject]; - if (actualProperty == nil) { - return; + }]; + }else { + modelObject = [class new]; + [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + NSString * actualProperty = key; + id subObject = obj; + if (replacePropertyNameMap != nil) { + NSString * replaceName = replacePropertyNameMap[actualProperty]; + if (replaceName) { + actualProperty = replaceName; } - setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); } - propertyInfo->setter = setter; - } - switch (propertyInfo->type) { - case _Array: - if(![subObject isKindOfClass:[NSNull class]]){ - Class subModelClass = NULL; - if (replaceContainerElementClassMap) { - subModelClass = replaceContainerElementClassMap[actualProperty]; - }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { - replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; - subModelClass = replaceContainerElementClassMap[actualProperty]; - [class setContainerElementClassMapper:replaceContainerElementClassMap]; - } - if (subModelClass == NULL) { - subModelClass = NSClassFromString(actualProperty); - if (subModelClass == nil) { - NSString * first = [actualProperty substringToIndex:1]; - NSString * other = [actualProperty substringFromIndex:1]; - subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); - } + WHC_ModelPropertyInfo * propertyInfo = [class getPropertyInfo:actualProperty]; + if (propertyInfo == nil) { + if (replacePropertyClassMap) { + propertyInfo = [WHC_ModelPropertyInfo new]; + [propertyInfo setClass:replacePropertyClassMap[actualProperty] valueClass:[obj class]]; + }else { + if ([class respondsToSelector:@selector(whc_ModelReplacePropertyClassMapper)]) { + [class setModelPropertyClassMapper:[class whc_ModelReplacePropertyClassMapper]]; } - if (subModelClass) { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:subModelClass]); - }else { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + propertyInfo = [self classExistProperty:actualProperty withObject:modelObject valueClass:[obj class]]; + } + if (propertyInfo) { + [class setModelInfo:propertyInfo property:actualProperty]; + }else { + return; + } + SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); + if (![modelObject respondsToSelector:setter]) { + actualProperty = [self existproperty:actualProperty withObject:modelObject]; + if (actualProperty == nil) { + return; } - - }else{ - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @[]); + setter = NSSelectorFromString([NSString stringWithFormat:@"set%@%@:",[actualProperty substringToIndex:1].uppercaseString, [actualProperty substringFromIndex:1]]); } - break; - case _Dictionary: - if(![subObject isKindOfClass:[NSNull class]]){ - Class subModelClass = NULL; - if (replaceContainerElementClassMap) { - subModelClass = replaceContainerElementClassMap[actualProperty]; - }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { - replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + propertyInfo->setter = setter; + } + switch (propertyInfo->type) { + case _Array: + if(![subObject isKindOfClass:[NSNull class]]){ + Class subModelClass = NULL; if (replaceContainerElementClassMap) { subModelClass = replaceContainerElementClassMap[actualProperty]; + }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { + replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + subModelClass = replaceContainerElementClassMap[actualProperty]; [class setContainerElementClassMapper:replaceContainerElementClassMap]; } + if (subModelClass == NULL) { + subModelClass = NSClassFromString(actualProperty); + if (subModelClass == nil) { + NSString * first = [actualProperty substringToIndex:1]; + NSString * other = [actualProperty substringFromIndex:1]; + subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + } + } + if (subModelClass) { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:subModelClass]); + }else { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + + }else{ + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @[]); } - if (subModelClass == NULL) { - subModelClass = NSClassFromString(actualProperty); - if (subModelClass == nil) { - NSString * first = [actualProperty substringToIndex:1]; - NSString * other = [actualProperty substringFromIndex:1]; - subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + break; + case _Dictionary: + if(![subObject isKindOfClass:[NSNull class]]){ + Class subModelClass = NULL; + if (replaceContainerElementClassMap) { + subModelClass = replaceContainerElementClassMap[actualProperty]; + }else if ([class respondsToSelector:@selector(whc_ModelReplaceContainerElementClassMapper)]) { + replaceContainerElementClassMap = [class whc_ModelReplaceContainerElementClassMapper]; + if (replaceContainerElementClassMap) { + subModelClass = replaceContainerElementClassMap[actualProperty]; + [class setContainerElementClassMapper:replaceContainerElementClassMap]; + } + } + if (subModelClass == NULL) { + subModelClass = NSClassFromString(actualProperty); + if (subModelClass == nil) { + NSString * first = [actualProperty substringToIndex:1]; + NSString * other = [actualProperty substringFromIndex:1]; + subModelClass = NSClassFromString([NSString stringWithFormat:@"%@%@",[first uppercaseString],other]); + } } + if (subModelClass) { + NSMutableDictionary * subObjectDictionary = [NSMutableDictionary dictionary]; + [subObject enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { + [subObjectDictionary setObject:[self handleDataModelEngine:obj class:subModelClass] forKey:key]; + }]; + ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObjectDictionary); + }else { + ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + + }else{ + ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @{}); } - if (subModelClass) { - NSMutableDictionary * subObjectDictionary = [NSMutableDictionary dictionary]; - [subObject enumerateKeysAndObjectsUsingBlock:^(NSString * key, id _Nonnull obj, BOOL * _Nonnull stop) { - [subObjectDictionary setObject:[self handleDataModelEngine:obj class:subModelClass] forKey:key]; - }]; - ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObjectDictionary); - }else { - ((void (*)(id, SEL, NSArray *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + break; + case _String: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + }else{ + ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @""); } - - }else{ - ((void (*)(id, SEL, NSDictionary *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @{}); - } - break; - case _String: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - }else{ - ((void (*)(id, SEL, NSString *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @""); - } - break; - case _Number: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - }else{ - ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @(0)); - } - break; - case _Integer: - ((void (*)(id, SEL, NSInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject integerValue]); - break; - case _UInteger: - ((void (*)(id, SEL, NSUInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject unsignedIntegerValue]); - break; - case _Boolean: - ((void (*)(id, SEL, BOOL))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject boolValue]); - break; - case _Float: - ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject floatValue]); - break; - case _Double: - ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject doubleValue]); - break; - case _Char: - ((void (*)(id, SEL, char))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject charValue]); - break; - case _Model: - ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:propertyInfo->class]); - break; - case _Date: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSDate *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - } - break; - case _Value: - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSValue *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); - } - break; - case _Data: { - if(![subObject isKindOfClass:[NSNull class]]){ - ((void (*)(id, SEL, NSData *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + break; + case _Number: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + }else{ + ((void (*)(id, SEL, NSNumber *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, @(0)); + } + break; + case _Integer: + ((void (*)(id, SEL, NSInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject integerValue]); + break; + case _UInteger: + ((void (*)(id, SEL, NSUInteger))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject unsignedIntegerValue]); + break; + case _Boolean: + ((void (*)(id, SEL, BOOL))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject boolValue]); + break; + case _Float: + ((void (*)(id, SEL, float))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject floatValue]); + break; + case _Double: + ((void (*)(id, SEL, double))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject doubleValue]); + break; + case _Char: + ((void (*)(id, SEL, char))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [subObject charValue]); + break; + case _Model: + ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, [self handleDataModelEngine:subObject class:propertyInfo->class]); + break; + case _Date: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSDate *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; + case _Value: + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSValue *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; + case _Data: { + if(![subObject isKindOfClass:[NSNull class]]){ + ((void (*)(id, SEL, NSData *))(void *) objc_msgSend)((id)modelObject, propertyInfo->setter, subObject); + } + break; } - break; + default: + + break; } - default: - - break; - } - }]; + }]; + } return modelObject; }else if ([object isKindOfClass:[NSArray class]]){ NSMutableArray * modelObjectArr = [NSMutableArray new];