数据解析类库(代码原文+注释)

来源:互联网 发布:高中辅导书推荐知乎 编辑:程序博客网 时间:2024/05/01 14:17

由于数据类过多,要是每个类都写一个初始化方法的话。。那样太浪费时间了。所以我写了一个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;
    }
}


0 0
原创粉丝点击