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