快速生成Model

2016-06-14  本文已影响1147人  queuey

目前iOS开发无论是哪种设计模式基本上和Model都脱不开关系,那么怎么快速的写出一个Model呢。下面有几种方法可供大家选择。

1.通过json直接生成Model类。

已经有很多很方便的插件来实现了这种功能。
参考
如果不喜欢xcode有太多插件,那么可以参考下面方法。

2.通过dictionary快速生成Property属性。

GitHub地址
该方法为一个Dictionary的类别。直接使用字典对象调用此方法即可。支持循环遍历。

安装

CocoaPods

在 Podfile 中添加 pod 'YBDictionaryToModel'。
执行 pod install 或 pod update。
导入 <YBDictionaryToModel>。

我们只需要使用原字典对象调用propertyCodeForModel方法,即可在控制台打印出目标Property属性。

- (void)printPropertyCodeToConsole:(BOOL)recursion {
 NSMutableString * printString = [NSMutableString new];
 
 if (!self) {
  NSLog(@"Dictionary is nil");
  return;
 }
 if (![self isKindOfClass:[NSDictionary class]]) {
  NSLog(@"it is not a dictionary!!!");
  return;
 }
 
 [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
  NSString *str;
  
  NSLog(@"key: %@ \t\t %@",key,[obj class]);
  
  if ([obj isKindOfClass:[NSString class]]) {
   str = [NSString stringWithFormat:@"@property (nonatomic, copy  ) NSString *%@;",key];
  }
  
  if ([obj isKindOfClass:[NSArray class]]) {
   str = [NSString stringWithFormat:@"@property (nonatomic, strong) NSArray *%@;",key];
  }
  
  if ([obj isKindOfClass:[NSDictionary class]]) {
   str = [NSString stringWithFormat:@"@property (nonatomic, strong) NSDictionary *%@;",key];
   if (recursion) {
    [obj printPropertyCodeToConsole:YES];
   }
  }
  
  if ([obj isKindOfClass:[NSNumber class]]) {
   NSNumber *number = (NSNumber *)obj;
   if (strcmp(number.objCType, @encode(int)) == 0) {
    str = [NSString stringWithFormat:@"@property (nonatomic, assign) NSInteger %@;",key];
   }
   if (strcmp(number.objCType, @encode(Boolean)) == 0) {
    str = [NSString stringWithFormat:@"@property (nonatomic, assign) BOOL %@;",key];
   }
   if (strcmp(number.objCType, @encode(float)) == 0) {
    str = [NSString stringWithFormat:@"@property (nonatomic, assign) CGFloat %@;",key];
   }
   if (strcmp(number.objCType, @encode(double)) == 0) {
    str = [NSString stringWithFormat:@"@property (nonatomic, assign) double %@;",key];
   }
   NSLog(@"%s",number.objCType);
  }
  
  if ([obj isKindOfClass:NSClassFromString(@"__NSCFBoolean")]) {
   str = [NSString stringWithFormat:@"@property (nonatomic, assign) BOOL %@;",key];
  }
  
  [printString appendFormat:@"\n%@\n",str];
 }];
 
 NSLog(@"\n-----------------------------------------\n%@\n-----------------------------------------",printString);
 
}

字典中Value所属类实际上是常见数据类型的一些子类,
__NSArrayI是NSArray一个子类
__NSDictionaryI是NSDictionary的子类
__NSCFConstantString是NSString的子类
__NSCFBoolean是NSNumber的子类
__NSCFNumber是NSNumber的子类

大家发现NSCFboolean和NSCFNumber都是属于NSNumber类型,前者用来储存布尔类型,后者则储存整型、float、double型。区分则可以使number.objCType得到NSNumber的值,这个值对应为C语言基本数据类型的prefix比如strcmp(number.objCType, @encode(double)) == 0可以判断number的值是否为double。

注:关于判断NSNumber类型数据存储的基本数据类型是float还是double目前没有解决,如果有人有思路或者解决方案。还请不吝赐教。

上一篇下一篇

猜你喜欢

热点阅读