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