国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

批量修改OC類名腳本 -- python

cc17 / 957人閱讀

摘要:前言近日由于種種原因,需要把代碼里面的類全部都修改一遍類名。并且在給類文件重命名的時,需要注意前綴和后綴添加的位置,不要添加到和后面去了即可。

前言

近日由于種種原因,需要把代碼里面的類全部都修改一遍類名。

在網上找了一圈相關的開源庫,沒有發現有合適滿意的,始終都存在一些問題,要么出現誤修改,要么把方法名或者屬性名也給修改了等等情況。

于是決定掏出生疏的Python來寫一個。

批量修改類名需要解決四個問題:

如何取得需要修改的類名?

如何修改文件中出現的類名并且不會出現誤改等情況?

如何修改文件名?

修改文件名后,如何同步修改project.pbxproj里面的文件名信息?

問題一、如何取得需要修改的類名?
想法A:
由于自己前不久寫了一個獲取target對應的編譯以及資源文件的工具MacPbxprojHelper,利用其來獲取到target對應的類名寫入文件,然后用python來讀取文件獲取到需要修改的類名,實時上第一版我也是這么做的,但是不夠優雅,明明一個腳本能解決的事,為什么需要那么多步操作呢?
想法B:
利用python直接遍歷文件夾獲取類名,沒錯就決定是你了。
其實用python遍歷文件實現起來特別簡單快捷。但是其中也有可能存在的問題,例如我們的項目中包含有部分資源文件,而資源文件的后綴名是不定的,但是實際我們只需要.m以及.mm結尾的文件前綴作為我們的類名,當然其中包含有類目也需要過濾掉。并且考慮到我們具備一些特殊的需求,需要過濾某些文件甚至某些文件夾下的文件等等。我這邊的腳本都有考慮到

實現代碼如下:

def getClassNames(filepath):
    #讀取文件名入數組
    #過濾文件夾
    filterDirs = ["ThirdKit/","小說/"]
    #過濾文件
    filterFiles = []
    classNames = []
    #遍歷filepath下所有文件,包括子目錄
    for root, dirs, files in os.walk(filepath):
        for name in files:
            path = os.path.join(root, name)
            #過濾文件夾
            isFilterDir = 0
            for filterDir in filterDirs:
                if filterDir in path:
                    isFilterDir = 1
                    break
            if isFilterDir != 1:
                if ".m" in name:
                    splitNames = name.split(".m")
                    #只選擇.m和.mm結尾的文件
                    if splitNames[1] == "" or splitNames[1] == "m":
                        cn = splitNames[0]
                        #過濾文件
                        isFilterFile = 0
                        for ff in filterFiles:
                            if ff == cn:
                                isFilterFile = 1
                        if isFilterFile != 1:
                            #過濾類目
                            if cn.find("+") == -1:
                                print(cn)
                                classNames.append(cn)
    return classNames
問題二、如何修改文件中出現的類名并且不出現誤改的情況?

在我搜集到的開源的腳本中,有極大比例的一部分是直接通過類名替換,其實這特別容易出現誤改。比如我有一個類名為ABC,一個類名為AB,那么ABC就可能出現被修改兩次的情況。所以我這邊就采用笨辦法,先敲定類名出現的場景,根據其場景設定規則,只有出現類名出現在這些規則中時,才去替換,這樣就可以保證100%的正確率。(這也是大坑,因為不同的程序員書寫習慣的問題,導致規則的定義實際極度繁瑣,而且會出現部分遺漏,每一次遺漏后,我都需要添加規則再重跑來驗證··)

下面就是這個腳本最大的貢獻·· 自認為基本涵蓋完了類名的出現場景(如果有沒有涵蓋的,請記得一定聯系我!!),一共37種規則,運用這37種規則,做到了一次腳本,既完美修改,無需在動代碼就可以直接運行并且不會有閃退問題··
#一開始構思了 14個 后來....
    rule_1 = """ + cn + "." #引用修改
    rule_2 = """ + cn + """ #類名被直接使用
    rule_3 = ":" + cn + " " #繼承 后續有空格
    rule_4 = ":" + cn + "
" #類名后面是換行
    rule_5 = " " + cn + "<"
    rule_6 = " " + cn + "
" #類名后面是換行
    rule_7 = " " + cn + " "
    rule_8 = " " + cn + "("
    rule_9 = "[" + cn + " "
    rule_10 = "[" + cn + "*"
    rule_11 = "(" + cn + "*"
    rule_12 = ")" + cn + "*"
    rule_13 = " " + cn + "*"
    rule_14 = " " + cn + "
"
    rule_15 = "(" + cn + " "
    rule_16 = " " + cn + ";"
    rule_17 = "," + cn + " "
    rule_18 = "," + cn + "*"
    rule_19 = ")" + cn + " " 
    rule_20 = "," + cn + ";"
    rule_21 = " " + cn + ","
    rule_22 = "<" + cn + "*" #被當做協議 遵守類
    rule_23 = "<" + cn + " "
    rule_24 = "," + cn + ","
    rule_25 = " " + cn + ":"
    rule_26 = ":" + cn + "http://" #后面跟注釋的、、我TM。。
    rule_27 = " " + cn + "http://" 
    rule_28 = " " + cn + "{" #后面跟大括號的··
    rule_29 = ")" + cn + "<" #為什么遵守協議 也用了 實際類名 沒有用ID
    rule_30 = "(" + cn + "." #為什么類要使用.語法
    rule_31 = " " + cn + "."  #類名調用.語法
    rule_32 = "!" + cn + "."  
    rule_33 = ":" + cn + "."  #類名調用點語法 被當做參數傳入
    rule_34 = "[" + cn + "
" #類名被換行
    rule_35 = ":" + cn + "<" #繼承類名后面 直接接入協議 默認實際是不存在這個問題的
    rule_36 = """ + cn + "_" #類取名有下劃線以及數字 以及通過工廠用數字來創建的情況
    rule_37 = """ + cn + "%" #類取名有數字 以及通過工廠用數字來創建的情況
問題三、如何修改文件名?

這個問題其實很好解決,利用python的os庫就可以直接rename,只是需要拼接全路徑。并且在給類文件重命名的時,需要注意前綴和后綴添加的位置,不要添加到.h和.m后面去了即可。

問題四、如何同步修改project.pbxproj里面的文件信息?

這里又和第二個問題一樣需要定義一定規則,才能確保不會出現誤替換,但是這個規則和上面比起來簡直是小巫見大巫。規則如下:

def pbRule(cn):
    rule_1 = "=" + cn + "."
    rule_2 = " " + cn + "."
    rule_3 = "/" + cn + "."
    rule_4 = """ + cn + "."
以上,問題都解決了。
使用方式
----------腳本說明----------
腳本用于批量修改類名
腳本可傳入四個參數
1、待處理的文件路徑. example-->"./KanManHua"
2、待修改的pbxproj文件地址 example--        >"./KanManHua.xcodeproj/project.pbxproj"
3、類名前綴 example-->"MHT_"
4、類名后綴 example-->"_MHT"

其中前三個參數為必傳參數 劃重點,要考
----------請開心使用---------
另腳本支持 -h --help 操作

當參數錯誤時,也有對應提示以及上述幫助信息

正常使用

示例:

python changeClassName.py ./KanManHua ./KanManHua.xcodeproj/project.pbxproj MHT_ _MHT
helpinfo獲取

示例:

python changeClassName.py
python changeClassName.py -h
python changeClassName.py --help
腳本地址 后記

由于我司還有需求修改指定 target的類名,實際也有一套可以僅僅只修改target類名的方法,但是由于使用要復雜一點,首先要提取target對應的編譯類,再使用腳本來修改,修改使用到我之前發布的一個工具類MacPbxprojHelper,如有需要的話請和我聯系。
聯系方式:357863248@qq.com

MacPbxprojHelper介紹鏈接

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42859.html

相關文章

  • Redis開發學習

    摘要:語法命令基本語法實例數據類型支持五種數據類型字符串,哈希,列表,集合及有序集合。資源修改文件增加如下內容如果在集成環境的目錄下安裝完成后重啟或。 Redis 簡介 Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。Redis 與其他 key - value 緩存產品有以下三個特點: Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的...

    ccj659 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<