Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加Swift对YYModel/MJExtension的支持 #19

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions ESJsonFormatForMac/Controller/ESInputJsonController.m
Original file line number Diff line number Diff line change
Expand Up @@ -685,10 +685,18 @@ - (ESClassInfo *)dealPropertyNameWithClassInfo:(ESClassInfo *)classInfo{
//如果是 NSArray 取出第一个元素向下遍历
NSArray *array = obj;
if (array.firstObject) {
NSObject *obj = [array firstObject];

//将数组中每个元素有值的key汇合到一起
NSMutableDictionary *useDic = @{}.mutableCopy;
[array enumerateObjectsUsingBlock:^(id _Nonnull obj2, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj2 isKindOfClass:NSDictionary.class]) {
[useDic addEntriesFromDictionary:obj2];
}
}];

//May be 'NSString',will crash
if ([obj isKindOfClass:[NSDictionary class]]) {
ESClassInfo *childClassInfo = [[ESClassInfo alloc] initWithClassNameKey:key ClassName:childClassName classDic:(NSDictionary *)obj];
if ([useDic isKindOfClass:[NSDictionary class]]) {
ESClassInfo *childClassInfo = [[ESClassInfo alloc] initWithClassNameKey:key ClassName:childClassName classDic:(NSDictionary *)useDic];
[self dealPropertyNameWithClassInfo:childClassInfo];
//设置classInfo里面属性类型为 NSArray 情况下,NSArray 内部元素类型的对应的class
[classInfo.propertyArrayDic setObject:childClassInfo forKey:key];
Expand Down Expand Up @@ -786,7 +794,10 @@ -(void)outputResult:(ESClassInfo*)classInfo{
}else{

//Swift
[self.hContentTextView insertText:classInfo.classContentForH];
//最顶层的类
NSMutableString *result = classInfo.classContentForH.mutableCopy;
[result appendString:@"\n"];
[self.hContentTextView insertText:result];

//再添加把其他类的的字符串拼接到最后面
[self.hContentTextView insertText:classInfo.classInsertTextViewContentForH replacementRange:NSMakeRange(self.hContentTextView.string.length, 0)];
Expand Down
221 changes: 163 additions & 58 deletions ESJsonFormatForMac/Format/ESJsonFormatManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ + (NSString *)parsePropertyContentWithClassInfo:(ESClassInfo *)classInfo{
NSDictionary *dic = classInfo.classDic;
[dic enumerateKeysAndObjectsUsingBlock:^(id key, NSObject *obj, BOOL *stop) {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isSwift"]) {
[resultStr appendFormat:@"\n%@\n",[self formatSwiftWithKey:key value:obj classInfo:classInfo]];
[resultStr appendFormat:@"\n%@",[self formatSwiftWithKey:key value:obj classInfo:classInfo]];
}else{
[resultStr appendFormat:@"\n%@\n",[self formatObjcWithKey:key value:obj classInfo:classInfo]];
}
Expand Down Expand Up @@ -106,50 +106,6 @@ + (NSString *)formatObjcWithKey:(NSString *)key value:(NSObject *)value classInf
}


/**
* 格式化Swift属性字符串
*
* @param key JSON里面key字段
* @param value JSON里面key对应的NSDiction或者NSArray
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)formatSwiftWithKey:(NSString *)key value:(NSObject *)value classInfo:(ESClassInfo *)classInfo{
NSString *typeStr = @"String?";
//判断大小写
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {
key = [key uppercaseString];
}
if ([value isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:@" var %@: %@",key,typeStr];
}else if([value isKindOfClass:[@(YES) class]]){
typeStr = @"Bool";
return [NSString stringWithFormat:@" var %@: %@ = false",key,typeStr];
}else if([value isKindOfClass:[NSNumber class]]){
NSString *valueStr = [NSString stringWithFormat:@"%@",value];
if ([valueStr rangeOfString:@"."].location!=NSNotFound){
typeStr = @"Double";
}else{
typeStr = @"Int";
}
return [NSString stringWithFormat:@" var %@: %@ = 0",key,typeStr];
}else if([value isKindOfClass:[NSArray class]]){
ESClassInfo *childInfo = classInfo.propertyArrayDic[key];
NSString *type = childInfo.className;
return [NSString stringWithFormat:@" var %@: [%@]?",key,type==nil?@"String":type];
}else if ([value isKindOfClass:[NSDictionary class]]){
ESClassInfo *childInfo = classInfo.propertyClassDic[key];
typeStr = childInfo.className;
if (!typeStr) {
typeStr = [key capitalizedString];
}
return [NSString stringWithFormat:@" var %@: %@?",key,typeStr];
}
return [NSString stringWithFormat:@" var %@: %@",key,typeStr];
}



+ (NSString *)parseClassHeaderContentWithClassInfo:(ESClassInfo *)classInfo{
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isSwift"]) {
Expand Down Expand Up @@ -227,6 +183,120 @@ + (NSString *)parseClassHeaderContentForOjbcWithClassInfo:(ESClassInfo *)classIn
return [result copy];
}

/**
* 生成 MJExtension 的集合中指定对象的方法
*
* @param classInfo 指定类信息
*
* @return
*/
+ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo{


if (classInfo.propertyArrayDic.count==0) {
return @"";
}else{
NSMutableString *result = [NSMutableString string];
for (NSString *key in classInfo.propertyArrayDic) {
ESClassInfo *childClassInfo = classInfo.propertyArrayDic[key];
[result appendFormat:@"@\"%@\" : [%@ class], ",key,childClassInfo.className];
}
if ([result hasSuffix:@", "]) {
result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
}


BOOL isYYModel = [[NSUserDefaults standardUserDefaults] boolForKey:@"isYYModel"];
NSString *methodStr = nil;
if (isYYModel) {

//append method content (objectClassInArray) if YYModel
methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{\n return @{%@};\n}\n",result];
}else{
// append method content (objectClassInArray)
methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)mj_objectClassInArray{\n return @{%@};\n}\n",result];
}

return methodStr;
}
}


+ (NSString *)methodContentOfObjectIDInArrayWithClassInfo:(ESClassInfo *)classInfo{


NSMutableString *result = [NSMutableString string];
NSDictionary *dic = classInfo.classDic;
NSLog(@"%@",dic);
[dic enumerateKeysAndObjectsUsingBlock:^(id key, NSObject *obj, BOOL *stop) {


NSLog(@"key====%@",key);
NSLog(@"obj====%@",obj);
NSLog(@"=============================");
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {


[result appendFormat:@"@\"%@\":@\"%@\", ",[key uppercaseString],key];
}

}];

if ([result hasSuffix:@", "]) {
result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary<NSString *,id> *)modelCustomPropertyMapper{\n return @{%@};\n}\n",result];
return methodStr;
}

return result;
}

#pragma mark - swift begin

/**
* 格式化Swift属性字符串
*
* @param key JSON里面key字段
* @param value JSON里面key对应的NSDiction或者NSArray
* @param classInfo 类信息
*
* @return
*/
+ (NSString *)formatSwiftWithKey:(NSString *)key value:(NSObject *)value classInfo:(ESClassInfo *)classInfo{
NSString *typeStr = @"String?";
//判断大小写
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {
key = [key uppercaseString];
}
if ([value isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:@" @objc var %@: %@",key,typeStr];
}else if([value isKindOfClass:[@(YES) class]]){
typeStr = @"Bool";
return [NSString stringWithFormat:@" @objc var %@: %@ = false",key,typeStr];
}else if([value isKindOfClass:[NSNumber class]]){
NSString *valueStr = [NSString stringWithFormat:@"%@",value];
if ([valueStr rangeOfString:@"."].location!=NSNotFound){
typeStr = @"Double";
}else{
typeStr = @"Int";
}
return [NSString stringWithFormat:@" @objc var %@: %@ = 0",key,typeStr];
}else if([value isKindOfClass:[NSArray class]]){
ESClassInfo *childInfo = classInfo.propertyArrayDic[key];
NSString *type = childInfo.className;
return [NSString stringWithFormat:@" @objc var %@: [%@]?",key,type==nil?@"String":type];
}else if ([value isKindOfClass:[NSDictionary class]]){
ESClassInfo *childInfo = classInfo.propertyClassDic[key];
typeStr = childInfo.className;
if (!typeStr) {
typeStr = [key capitalizedString];
}
return [NSString stringWithFormat:@" @objc var %@: %@?",key,typeStr];
}
return [NSString stringWithFormat:@" @objc var %@: %@",key,typeStr];
}


/**
* 解析.swift文件内容--Swift
*
Expand All @@ -238,30 +308,62 @@ + (NSString *)parseClassContentForSwiftWithClassInfo:(ESClassInfo *)classInfo{
NSString *superClassString = [[NSUserDefaults standardUserDefaults] valueForKey:@"SuperClass"];
NSMutableString *result = nil;
if (superClassString&&superClassString.length>0) {
result = [NSMutableString stringWithFormat:@"@interface %@ : %@\n",classInfo.className,superClassString];
result = [NSMutableString stringWithFormat:@"class %@: %@ {\n",classInfo.className,superClassString];
}else{
result = [NSMutableString stringWithFormat:@"@interface %@ : NSObject\n",classInfo.className];
result = [NSMutableString stringWithFormat:@"\nclass %@: NSObject {\n",classInfo.className];
}
[result appendString:classInfo.propertyContent];
[result appendString:@"\n"];
[result appendString:[self parseClassImpContentWithClassInfoForSwift:classInfo]];
[result appendString:@"\n}"];
if ([ESJsonFormatSetting defaultSetting].outputToFiles) {
[result insertString:@"import UIKit\n\n" atIndex:0];
[result insertString:@"import Foundation\n" atIndex:0];
//headerStr
NSMutableString *headerString = [NSMutableString stringWithString:[self dealHeaderStrWithClassInfo:classInfo type:@"swift"]];
[result insertString:headerString atIndex:0];
}
return [result copy];
}

+ (NSString *)parseClassImpContentWithClassInfoForSwift:(ESClassInfo *)classInfo
{
NSMutableString *result = [NSMutableString stringWithString:@""];
if ([ESJsonFormatSetting defaultSetting].impOjbClassInArray) {

BOOL isYYModel = [[NSUserDefaults standardUserDefaults] boolForKey:@"isYYModel"];

if (isYYModel) {

NSString *propertyClass = [self methodContentOfObjectClassInArrayWithClassInfoForSwift:classInfo];
NSString *customMapper = [self methodContentOfObjectIDInArrayWithClassInfoForSwift:classInfo];

if ([propertyClass stringByReplacingOccurrencesOfString:@"" withString:@"\n"].length) {
[result appendFormat:@" \n%@",propertyClass];
}
if ([customMapper stringByReplacingOccurrencesOfString:@"" withString:@"\n"].length) {
[result appendFormat:@" \n%@",customMapper];
}

}else{

[result appendFormat:@" \n%@",[self methodContentOfObjectClassInArrayWithClassInfoForSwift:classInfo]];
}

}else{

}

return [result copy];
}

/**
* 生成 MJExtension 的集合中指定对象的方法
* 生成 MJExtension 的集合中指定对象的方法 Swift
*
* @param classInfo 指定类信息
*
* @return
*/
+ (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)classInfo{
+ (NSString *)methodContentOfObjectClassInArrayWithClassInfoForSwift:(ESClassInfo *)classInfo{


if (classInfo.propertyArrayDic.count==0) {
Expand All @@ -270,30 +372,30 @@ + (NSString *)methodContentOfObjectClassInArrayWithClassInfo:(ESClassInfo *)clas
NSMutableString *result = [NSMutableString string];
for (NSString *key in classInfo.propertyArrayDic) {
ESClassInfo *childClassInfo = classInfo.propertyArrayDic[key];
[result appendFormat:@"@\"%@\" : [%@ class], ",key,childClassInfo.className];
[result appendFormat:@"\"%@\" : %@.self, ",key,childClassInfo.className];
}
if ([result hasSuffix:@", "]) {
result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
}


BOOL isYYModel = [[NSUserDefaults standardUserDefaults] boolForKey:@"isYYModel"];
NSString *methodStr = nil;
if (isYYModel) {

//append method content (objectClassInArray) if YYModel
methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{\n return @{%@};\n}\n",result];
methodStr = [NSString stringWithFormat:@" @objc static func modelContainerPropertyGenericClass() -> Dictionary<String, Any> {\n return [%@]\n }",result];
}else{
// append method content (objectClassInArray)
methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)objectClassInArray{\n return @{%@};\n}\n",result];

methodStr = [NSString stringWithFormat:@" @objc static func mj_objectClassInArray() -> Dictionary<String, Any> {\n return [%@]\n }",result];
}

return methodStr;
}
}


+ (NSString *)methodContentOfObjectIDInArrayWithClassInfo:(ESClassInfo *)classInfo{
+ (NSString *)methodContentOfObjectIDInArrayWithClassInfoForSwift:(ESClassInfo *)classInfo{


NSMutableString *result = [NSMutableString string];
Expand All @@ -308,20 +410,23 @@ + (NSString *)methodContentOfObjectIDInArrayWithClassInfo:(ESClassInfo *)classIn
if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {


[result appendFormat:@"@\"%@\":@\"%@\", ",[key uppercaseString],key];
[result appendFormat:@"\"%@\":\"%@\", ",[key uppercaseString],key];
}

}];

if ([result hasSuffix:@", "]) {
result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary<NSString *,id> *)modelCustomPropertyMapper{\n return @{%@};\n}\n",result];
NSString *methodStr = [NSString stringWithFormat:@" @objc static func modelCustomPropertyMapper() -> Dictionary<String, Any> {\n return [%@]\n }\n",result];
return methodStr;
}

return result;
}

#pragma mark - swift end


/**
* 拼装模板信息
*
Expand Down Expand Up @@ -360,7 +465,7 @@ + (NSString *)dealHeaderStrWithClassInfo:(ESClassInfo *)classInfo type:(NSString
[string appendString:[NSString stringWithFormat:@"#import \"%@.h\" \n\n",superClassString]];
}
}else{
[string appendString:@"import UIKit\n\n"];
[string appendString:@"import Foundation\n"];
NSString *superClassString = [[NSUserDefaults standardUserDefaults] valueForKey:@"SuperClass"];
if (superClassString&&superClassString.length>0) {
[string appendString:[NSString stringWithFormat:@"import %@ \n\n",superClassString]];
Expand Down
2 changes: 1 addition & 1 deletion ESJsonFormatForMac/Model/ESClassInfo.m
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ - (NSString *)classInsertTextViewContentForH{
NSMutableString *result = [NSMutableString stringWithFormat:@""];
for (NSString *key in self.propertyClassDic) {
ESClassInfo *classInfo = self.propertyClassDic[key];
[result appendFormat:@"%@\n\n",classInfo.classContentForH];
[result appendFormat:@"%@\n",classInfo.classContentForH];
[result appendString:classInfo.classInsertTextViewContentForH];
}

Expand Down
2 changes: 1 addition & 1 deletion ESJsonFormatForMac/Utils/FileManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ - (void)handleBaseData:(NSString *)folderPath
newMContent = [NSString stringWithFormat:@"%@%@%@",modelStr,mImportStr,mContent];
}else{

hImportStr = [NSMutableString stringWithString:@"import UIKit\n\n"];
hImportStr = [NSMutableString stringWithString:@"import Foundation\n"];
NSString *superClassString = [[NSUserDefaults standardUserDefaults] valueForKey:@"SuperClass"];
if (superClassString&&superClassString.length>0) {
[hImportStr appendString:[NSString stringWithFormat:@"import %@ \n\n",superClassString]];
Expand Down