数据解析类库(代码原文+注释)
来源:互联网 发布:高中辅导书推荐知乎 编辑:程序博客网 时间: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;
}
}
- 数据解析类库(代码原文+注释)
- ohci-s3c2410代码注释解析
- 金刚经原文、注释、译文完整版
- Angular js原文解析
- 注释解析类
- Sqlite3 语句原文解析摘取
- 数据绑定英文(原文)
- JAVA解析JSON数据代码
- PHP JSON 数据解析代码
- JSON数据解析代码示例
- Json数据解析代码demo
- 用状态方程解析出Java代码的三种注释
- swift:使用NSJSONSerialization解析本地json数据文件(代码详细注释)
- 代码注释
- 注释代码
- 注释代码
- 代码注释
- 代码注释
- sizeof和字节对齐
- MongoDB之数据建模
- 解决varnish 3.0 503 service unavailable 问题
- rhel 6& rhel7 找回root密码
- Leetcode: Find Minimum in Rotated Sorted Array
- 数据解析类库(代码原文+注释)
- oracle多行合并成一行
- nohead data big-endian ->little endian
- diffcount:统计工程代码变动行数
- Can't create handler inside thread that has not called Looper.prepare()解决办法
- $.extend 函数详解
- 判断奇偶
- windows shell 编程
- MYSQL 1093 - You can't specify target table '' for update in FROM clause