由于数据类过多,要是每个类都写一个初始化方法的话。。那样太浪费时间了。所以我写了一个NSObject类库(AnalyticalData)。
一般传过来的json都是字典类型的所以下面我直接用字典类型来展示数据。
实现思路大致是这样的:获取当前类(继承NSObject)的属性名字和属性类别与JSON过来的键值对进行对比。类别一样的则赋值,不一样的话爆出警告。
直接贴代码出来:
#import <Foundation/Foundation.h>
@interface NSObject (AnalyticalData)
-(instancetype)initWithDit:(NSDictionary *)passDit;
@end
#import "NSObject+AnalyticalData.h"
#import <objc/runtime.h>
@implementation NSObject (AnalyticalData)
-(instancetype)initWithDit:(NSDictionary *)passDit{
if (self=[self init]) {
unsigned int outCount=0;
Class cls=self.class;
//获取属性列表
Ivar *ivars = class_copyIvarList(cls, &outCount);
for (int i = 0; i < outCount; i++) {
Ivar ivar = ivars[i];
//获取属性名字
NSString *attributeName=[NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
//获取属性类型
NSLog(@"%@",attributeName);
NSString *attributeType=[NSString stringWithCString:ivar_getTypeEncoding(ivar) encoding:NSUTF8StringEncoding];
NSLog(@"%@",attributeType);
//以防后台传过来的数据没有_开头,而我们定义的属性的实例变量都是_开头(_name等);
NSString *matchAttribute;
if ([attributeName hasPrefix:@"_"])
{
matchAttribute=[attributeName substringFromIndex:1];
}
else
{
matchAttribute=attributeName;
}
if ([passDit objectForKey:matchAttribute]) {
id value=[passDit objectForKey:matchAttribute];
id newValue=[self p_returnNewTypeWithAttributeName:attributeType andClassName:NSStringFromClass([value class]) andTheValue:value];
if (newValue) {
[self setValue:newValue forKey:attributeName];
}
}
}
free(ivars);
}
return self;
}
//attributeName属性名className传过来的数据类型value传过来的数据
-(id)p_returnNewTypeWithAttributeName:(NSString *)attributeType andClassName:(NSString *)className andTheValue:(id)value{
int oneNumber =[self p_returnNumberWithTheCheckName:attributeType];
int twoNumber =[self p_returnNumberWithTheCheckName:className];
if (oneNumber==twoNumber) {
return value;
}
else
{
NSLog(@"类型不匹配");
return nil;
}
}
//0字符串1Number2字典3数组4其他常量类型
-(int)p_returnNumberWithTheCheckName:(NSString *)name{
if ([name containsString:@"String"]) {
return 0;
}else if ([name containsString:@"Number"]){
return 1;
}
else if ([name containsString:@"NSDictionar"]){
return 2;
}
else if ([name containsString:@"NSArray"]){
return 3;
}
else{
return 4;
}
}