通過swagger接口文檔自動生成Objective-C模型屬性和注釋

無論后端的接口文檔使用的是swagger還是wiki亦或是公司直接寫的一套,將文檔上面的信息逐一搬到我們自己寫model類的屬性中是一件很碼農(nóng)的活.這里以swagger為例,介紹一個使用python腳本實現(xiàn)半自動轉(zhuǎn)換的方式,能夠生成同名屬性且?guī)献⑨?同事們一起使用,再也不用擔心一個奇怪的屬性沒有注釋了.

如下圖是swagger文檔上面的

swagger文檔.png

我們的目的是自動生成所有對應屬性,且?guī)献⑨?/p>

@interface GQMatchModel : NSObject

/// 比賽狀態(tài)
@property (nonatomic, copy) NSString *matchState;

/// 球探id ,
@property (nonatomic, copy) NSString *qtId;

/// 客隊圖片 ,
@property (nonatomic, copy) NSString *awayTeamLogo;

/// 客隊id ,
@property (nonatomic, copy) NSString *awayTeamId;

/// 主隊圖片 ,
@property (nonatomic, copy) NSString *homeTeamLogo;

/// 主隊id ,
@property (nonatomic, copy) NSString *homeTeamId;

/// 比分 ,
@property (nonatomic, copy) NSString *score;

/// 客隊名 ,
@property (nonatomic, copy) NSString *awayTeamName;

/// 主隊名 ,
@property (nonatomic, copy) NSString *homeTeamName;

/// 比賽時間
@property (nonatomic, copy) NSString *matchTime;

@end

操作流程

1.首先我們還是要將上面的數(shù)據(jù)一次性copy到我們新建的 GQMatchModel類的.h中,
#import <Foundation/Foundation.h>
/*
 matchState (string, optional): 比賽狀態(tài)
 qtId (string, optional): 球探id ,
 awayTeamLogo (string, optional): 客隊圖片 ,
 awayTeamId (string, optional): 客隊id ,
 homeTeamLogo (string, optional): 主隊圖片 ,
 homeTeamId (string, optional): 主隊id ,
 score (string, optional): 比分 ,
 awayTeamName (integer, optional): 客隊名 ,
 homeTeamName (number, optional): 主隊名 ,
 matchTime (number, optional): 比賽時間
 */
@interface Person : NSObject


@end

2.在腳本中,讀取 GQMatchModel.h這個文件中的字符內(nèi)容,通過正則表達式或者其它方式匹配出所有屬性和對應的解釋
3.重新拼接字符串,并寫入 GQMatchModel.h中,完成對該文件的覆寫.

這里我使用python語言進行讀寫操作, 并且拓展了針對wiki文檔 | json字符 | 字典 自動生成屬性的方式.

使用其它語言編寫轉(zhuǎn)換代碼也是很容易的,你可以使用其它語言重寫一下邏輯,下面是針對swagger文檔的轉(zhuǎn)換方式.

def code_create_swagger(path):
    # 獲取文件數(shù)據(jù)
    data = open(path, "r", encoding="utf-8", errors="ignore")

    # 讀取第一行
    each = data.readline()

    # 屬性列表
    my_property_name_list = list()
    # 注釋列表
    my_property_annotation_list = list()
    # 存儲文件原內(nèi)容
    whole_string = ''

    # 遍歷每一行字符,取出屬性和注釋內(nèi)容
    while each:
        whole_string += each

        if each.find("@interface") != -1:
            each = data.readline()
            continue
        # (matchState (string, optional): 比賽狀態(tài)),分析單行字符結(jié)構(gòu)特點
        # 這里我們可以以 : 將屬性一側(cè)和注釋一側(cè)分割開
        # 屬性一側(cè)再使用正則匹配出第一個單詞,去掉空白符,就是我們想要的
        if each.find(":") != -1:
            left = each.split(":")[0]
            right = each.split(":")[1]

            result = re.search(r"\b[a-zA-Z_0-9]+\b", left)
            if result != None:
                name = result.group(0)
                name = name.strip()
                my_property_name_list.append(name)
                my_property_annotation_list.append("http:///" + right)

                each = data.readline()
                continue


        # 都沒匹配上則下一行繼續(xù)
        each = data.readline()
        continue

    # 開始拼接
    property_string = ''
    for i in range(len(my_property_name_list)):
        each_property = my_property_name_list[i]
        each_property = "@property (nonatomic, copy) NSString *%s;\n" % (each_property)
        each_annotation = my_property_annotation_list[i]

        property_string += each_annotation
        property_string += each_property
        property_string += "\n"

    whole_string = whole_string.replace("@end", property_string)
    whole_string += "\n@end"

    # 寫入原文件
    with open(path, 'w', encoding='utf-8', errors='ignore') as f:
        f.write(whole_string)
        

使用腳本

cd /Users/wen/PycharmProjects/MyScript
python3 auto_property.py -swagger -path /Users/wen/Documents/GitHub/funnyTry/funnyTry/funnyTry/Class/JustForFun/Playground/GQMatchModel.h

你可以在這里下載該腳本玩玩.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桶现,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子樱溉,更是在濱河造成了極大的恐慌容劳,老刑警劉巖风纠,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夸楣,死亡現(xiàn)場離奇詭異磁餐,居然都是意外死亡,警方通過查閱死者的電腦和手機幼衰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門靴跛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渡嚣,你說我怎么就攤上這事梢睛。” “怎么了识椰?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵绝葡,是天一觀的道長。 經(jīng)常有香客問我腹鹉,道長藏畅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任功咒,我火速辦了婚禮愉阎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘力奋。我一直安慰自己诫硕,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布刊侯。 她就那樣靜靜地躺著章办,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藕届,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天挪蹭,我揣著相機與錄音,去河邊找鬼休偶。 笑死梁厉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的踏兜。 我是一名探鬼主播词顾,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碱妆!你這毒婦竟也來了肉盹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤疹尾,失蹤者是張志新(化名)和其女友劉穎上忍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纳本,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窍蓝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了繁成。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓笙。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖巾腕,靈堂內(nèi)的尸體忽然破棺而出面睛,到底是詐尸還是另有隱情,我是刑警寧澤祠墅,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布侮穿,位于F島的核電站,受9級特大地震影響毁嗦,放射性物質(zhì)發(fā)生泄漏亲茅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一狗准、第九天 我趴在偏房一處隱蔽的房頂上張望克锣。 院中可真熱鬧,春花似錦腔长、人聲如沸袭祟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巾乳。三九已至您没,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胆绊,已是汗流浹背氨鹏。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留压状,地道東北人仆抵。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像种冬,于是被迫代替她去往敵國和親镣丑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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