一行代碼生成model.h

作為手藝人還是多學(xué)點(diǎn)東西好,不然當(dāng)你四十歲被公司開了,或者行業(yè)不景氣了想要跳出這個(gè)坑,沒有點(diǎn)手藝咋混zzz. web幾經(jīng)在學(xué)了貌似web也要.......
不跟你多比比 下面這個(gè)分類解決的問題就是 不用手敲model.h 的代碼其實(shí)也可以不用敲model.m的代碼(相信沒幾個(gè)人是手敲的).我只是看到有提出這個(gè)需求自己 簡(jiǎn)單寫一個(gè).
鏈接地址git

上代碼
NSObject.h的分類

//  NSObject+CreatProperty.h
//  一行代碼生成Model.h
//   Copyright ? 2017年 3D. All rights reserved.

#import <Foundation/Foundation.h>
@interface NSObject (CreatProperty)
+ (void)createPropertyCodeWithDict:(NSDictionary *)dict andClassStr:(NSString *)classStr andPrdfix:(NSString *)prdfix;
@end

NSObject.m的分類

//  NSObject+CreatProperty.m
//  一行代碼生成Model.h
//
//  Created by 3D on 17/2/27.
//  Copyright ? 2017年 3D. All rights reserved.

#import "NSObject+CreatProperty.h"

@implementation NSObject (CreatProperty)
+ (void)createPropertyCodeWithDict:(NSDictionary *)dict andClassStr:(NSString *)classStr andPrdfix:(NSString *)prdfix
{
  //目前分類中遍歷屬性類型 還沒加完全 而且字典中的NSNumber 都是生的int  先意思一下以后再完善??
 NSMutableString *strM = [NSMutableString string];
  // 遍歷字典
[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull propertyName, id  _Nonnull value, BOOL * _Nonnull stop) {
    
    //  NSLog(@"%@ %@",propertyName,[value class]);
    NSString *code;
    
    if ([value isKindOfClass:[NSString class]]) {
        code = [NSString stringWithFormat:@"@property (nonatomic, strong) NSString *%@;",propertyName]
        ;
    }else if ([value isKindOfClass:[NSNumber class]]){
        //這里寫的不完善 暫時(shí)都用int 保存
        code = [NSString stringWithFormat:@"@property (nonatomic, assign) int %@;",propertyName]
        ;
    }else if ([value isKindOfClass:[NSArray class]]){
        
        code = [NSString stringWithFormat:@"@property (nonatomic, strong) NSArray *%@;",propertyName]
        ;
        [self createPropertyCodeWithKey:propertyName andArray:value andPrdfix:prdfix];
    }else if ([value isKindOfClass:[NSDictionary class]]){
        
        code = [NSString stringWithFormat:@"@property (nonatomic, strong) %@ *%@;",[NSString stringWithFormat:@"%@%@Model",prdfix,propertyName],propertyName]
        ;
        [self createPropertyCodeWithKey:propertyName andDIC:value andPrdfix:prdfix];
    }else if ([value isKindOfClass:NSClassFromString(@"__NSCFBoolean")]){
        code = [NSString stringWithFormat:@"@property (nonatomic, assign) BOOL %@;",propertyName]
        ;
    }
    [strM appendFormat:@"\n%@\n",code];
}];
NSString *top = nil;

top = [NSString stringWithFormat:@"@interface %@ : NSObject",classStr];
NSString *bottom = @"@end";
NSString *allStr= [NSString stringWithFormat:@"\n%@\n%@\n%@\n\n",top,strM,bottom];
const char *cString1 = [allStr cStringUsingEncoding:NSUTF8StringEncoding];
printf("%s",cString1); //這里用c來打印免打印一寫不需要的 系統(tǒng)打印
}

+ (void)createPropertyCodeWithKey:(NSString *)key andArray:(NSArray *)arr andPrdfix:(NSString *)prdfix{
dispatch_async(dispatch_get_main_queue(), ^{
    NSString *classStr = [NSString stringWithFormat:@"%@%@Model",prdfix,key];
    [self createPropertyCodeWithDict:arr[0] andClassStr:classStr andPrdfix:prdfix];
});
}

+ (void)createPropertyCodeWithKey:(NSString *)key andDIC:(NSDictionary *)dic andPrdfix:(NSString *)prdfix{
dispatch_async(dispatch_get_main_queue(), ^{
    NSString *classStr = [NSString stringWithFormat:@"%@%@Model",prdfix,key];
    [self createPropertyCodeWithDict:dic andClassStr:classStr andPrdfix:prdfix];
});
}
@end

關(guān)鍵點(diǎn)就是下面兩個(gè)方法

  • (void)createPropertyCodeWithKey:(NSString *)key andArray:(NSArray *)arr andPrdfix:(NSString *)prdfix{
    dispatch_async(dispatch_get_main_queue(), ^{
    NSString *classStr = [NSString stringWithFormat:@"%@%@Model",prdfix,key];
    [self createPropertyCodeWithDict:arr[0] andClassStr:classStr andPrdfix:prdfix];
    });
    }

  • (void)createPropertyCodeWithKey:(NSString *)key andDIC:(NSDictionary *)dic andPrdfix:(NSString *)prdfix{
    dispatch_async(dispatch_get_main_queue(), ^{
    NSString *classStr = [NSString stringWithFormat:@"%@%@Model",prdfix,key];
    [self createPropertyCodeWithDict:dic andClassStr:classStr andPrdfix:prdfix];
    });
    }

這連個(gè)方法是異步主隊(duì)列 上次我記得已經(jīng)我已經(jīng)解釋過了 GCD的一些知識(shí)
我們要打印model的屬性總是希望一層一層的打印.但是在遞歸打印的時(shí)候有可能是這個(gè)樣的model模型例如

@{@"a":@"屬性1"
  @"b":@"屬性2"
  @"c":@"屬性3:
  @"d":@{@"aa":@"我是對(duì)象"}
  @"e":@"屬性4"}
  我們想生成
  xxxxxxxxxxx   a
  xxxxxxxxxxx   b
  xxxxxxxxxxx   c
  xxxxxxxxxxx   d
  xxxxxxxxxxx   e
  
  然后在生成
  xxxxxxxxxxx   aa
  你看上面其實(shí)是遞歸操作 遇見value是字典 或者 數(shù)組 就有調(diào)用

自己那么我們 這個(gè)時(shí)候第一層還沒打印玩 但是又要調(diào)用自己打印

下一層我們就可以 把打印下一層的 任務(wù)放在異步主隊(duì)列 (當(dāng)然打

 印調(diào)用這個(gè)方法前提是主隊(duì)列) 異步主隊(duì)列 第一不會(huì)影響 當(dāng)前線

程的任務(wù)(打印下面的屬性) 當(dāng)下面的屬性打印完了(主隊(duì)列空閑了)  

就會(huì)執(zhí)行我們第一次方法主隊(duì)列的任務(wù),依次進(jìn)行下去.最后我們只  

要打印臺(tái)粘貼復(fù)制

下面是這個(gè)分類的用法

 //  ViewController.m
//  一行代碼生成Model.h
//  Created by 3D on 17/2/27.
//  Copyright ? 2017年 3D. All rights reserved.

#import "ViewController.h"
#import "LCTestModel.h"
#import "NSObject+CreatProperty.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
//使用前請(qǐng)把xcode8自動(dòng)打印的log關(guān)掉比較 打印臺(tái)比較清爽
[super viewDidLoad];
 NSDictionary *dic0 = @{@"thumbnail_pic":@"http://ww4.sinaimg.cn/thumbnail/80292f4btw1eqi01myf23j20br08ogm0.jpg",
                      @"name":@"對(duì)象中有個(gè)數(shù)組數(shù)組里面是對(duì)象"};


NSDictionary *dic =  @{@"attitudes_count":@3,
                       @"created_at":@"剛剛",
                       @"idstr":@"3824316141411024",
                       @"pic_urls":@[dic0],
                       @"user":@{@"name":@"對(duì)象面有對(duì)象",
                                 @"vip":@1}
                       };
NSDictionary *dic1 =  @{@"attitudes_count":@3,
                       @"created_at":@"剛剛",
                       @"idstr":@"3824316141411024",
                       @"pic_urls":@[dic0],
                       @"user":@{@"name":@"豬豬愛講冷笑話",
                                 @"vip":@1}
                       };
NSDictionary *dic2 =  @{@"attitudes_count":@3,
                       @"created_at":@"剛剛",
                       @"idstr":@"3824316141411024",
                       @"pic_urls":@[dic0],
                       @"user":@{@"name":@"豬豬愛講冷笑話",
                                 @"vip":@1}
                       };

NSDictionary *dic3 =  @{@"statuses":@[dic,dic1,dic2],
  @"total_number":@1091};
[LCTestModel createPropertyCodeWithDict:dic3 andClassStr:NSStringFromClass([LCTestModel class]) andPrdfix:@"LC"];//@"LC"就是 model前綴自己定義我叫李長(zhǎng)城我就定義LC
}
@end

打印臺(tái)的效果圖就是

WechatIMG52.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末它抱,一起剝皮案震驚了整個(gè)濱河市秕豫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌观蓄,老刑警劉巖混移,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜘腌,居然都是意外死亡沫屡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門撮珠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人金矛,你說我怎么就攤上這事芯急。” “怎么了驶俊?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵娶耍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我饼酿,道長(zhǎng)榕酒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任故俐,我火速辦了婚禮想鹰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘药版。我一直安慰自己辑舷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布槽片。 她就那樣靜靜地躺著何缓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪还栓。 梳的紋絲不亂的頭發(fā)上碌廓,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音剩盒,去河邊找鬼谷婆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的波材。 我是一名探鬼主播股淡,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廷区!你這毒婦竟也來了唯灵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤隙轻,失蹤者是張志新(化名)和其女友劉穎埠帕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玖绿,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敛瓷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斑匪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呐籽。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚀瘸,靈堂內(nèi)的尸體忽然破棺而出狡蝶,到底是詐尸還是另有隱情,我是刑警寧澤贮勃,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布贪惹,位于F島的核電站,受9級(jí)特大地震影響寂嘉,放射性物質(zhì)發(fā)生泄漏奏瞬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一泉孩、第九天 我趴在偏房一處隱蔽的房頂上張望硼端。 院中可真熱鬧,春花似錦棵譬、人聲如沸显蝌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曼尊。三九已至,卻和暖如春脏嚷,著一層夾襖步出監(jiān)牢的瞬間骆撇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工父叙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留神郊,地道東北人肴裙。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涌乳,于是被迫代替她去往敵國(guó)和親蜻懦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn)寫博客想寫明白也是一件不容易的事情夕晓。 這次拿YYKIt 源碼 分析分析宛乃。希望這次能寫的更好些。 YYKit 系...
    充滿活力的早晨閱讀 6,572評(píng)論 4 16
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,380評(píng)論 0 6
  • iOS 開発の結(jié)構(gòu) 畫面 UI UIWebview [[UIApplication sharedApplicati...
    RencaiXiong閱讀 583評(píng)論 0 0
  • 設(shè)計(jì)模式是什么蒸辆? 你知道哪些設(shè)計(jì)模式征炼,并簡(jiǎn)要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)躬贡,就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,208評(píng)論 1 21
  • 最近有不少小伙伴留言說 不想把戶口落在公共集體戶 能不能把戶口落到朋友的房產(chǎn)下 其實(shí)公共集體戶和個(gè)體戶一樣 同屬于...
    入戶廣州閱讀 870評(píng)論 0 0