美文网首页
快速生成Model

快速生成Model

作者: queuey | 来源:发表于2016-06-14 17:27 被阅读1147次

    目前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目前没有解决,如果有人有思路或者解决方案。还请不吝赐教。

    相关文章

      网友评论

          本文标题:快速生成Model

          本文链接:https://www.haomeiwen.com/subject/btyudttx.html