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