快速生成Model

目前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目前沒有解決,如果有人有思路或者解決方案。還請不吝賜教。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容