Swift GYB 簡易教程

作者:Umberto Raimondi,原文鏈接,原文日期:2016-2-9
譯者:ahfepj;校對:numbbbbb;定稿:小鐵匠Linus

GYB(模板生成)是一個 Swift 內(nèi)部使用的工具,可以用模板生成源文件。

如果你有多個結(jié)構(gòu)體/類/枚舉在共享同一個通用的結(jié)構(gòu),并且你不想維護(hù)那些相同的代碼,就可以用 GYB。如果你經(jīng)常需要給不同的對象寫一些相似的方法或者屬性,那你的維護(hù)工作(由于粗心的復(fù)制/粘貼導(dǎo)致的錯誤)就可以全部交給 GYB。這個工具在 Swift 代碼庫 中廣泛使用,很容易就可以將它應(yīng)用到你的項(xiàng)目中。

作為一個勤奮的荷蘭豬(校對注:原文 guinea-pig,也可譯為豚鼠)(據(jù)我所知,目前唯一使用 GYB 的項(xiàng)目是 Swift-JNI,該項(xiàng)目是安卓的 Swift 移植項(xiàng)目的一部分)我在一個用于簡化 Swift 位運(yùn)算的庫 Bitter 中廣泛使用了 GYB,在這個庫里我寫了很多相似的代碼來擴(kuò)展固定長度的 Swift 整型變量。

有了這個工具,我就不需要手工輸入所有代碼。我只需定義一個模板,就可以用 GYB 工具創(chuàng)建十個擴(kuò)展。

讓我們來看看如何使用 GYB。

GYB 引擎元素

使用 GYB 模板引擎相當(dāng)簡單,但是需要一點(diǎn) Python 知識。模板是由這些元素組成:

  • 用 Python 來控制語句流,每行代碼由 % 開始(空格會被忽略),如你所想,每行代碼也由 % 結(jié)束,語句可以嵌套。

  • 不以 % 開頭的語句被視為文本,會被直接輸出。

  • ${VARIABLE_NAME} 形式的元素會被 VARIABLE__NAME 的值替換。

  • 字符 %$ 分別用 %%$$ 表示。

  • Python 代碼塊可以添加到模板中,用 %{}% 括起來,代碼塊外的縮進(jìn)會被剝離,使你的 Python 代碼不會受到影響。

讓我們用這幾個簡單的規(guī)則來做一個例子,拿 Bitter 的模板 來說,用 allOne 為所有固定長度的整形變量添加一個計算屬性,就會返回一個由帶有 allOne 的位模式初始化后得到的整型變量/無符號整形變量:

%{
  intTypes = [8,16,32,64]
}%

% for intType in intTypes:
    % for sign in ['','U']:

/// Extension that adds a few additional functionalities to ${sign}Int${intType}
extension 
${sign}Int${intType} {

        /// Returns a ${sign}Int${intType} with all ones
        %if sign == '':
    public static var allOnes:Int${intType}{return Int${intType}(bitPattern: UInt${intType}.max)}
        %else:
    public static var allOnes:UInt${intType}{return UInt${intType}.max}
        %end

}
    %end
%end

有了 Python 代碼塊,我們就可以在 Swift 中建立一個固定長度整型數(shù)組,然后遍歷它并使用內(nèi)部循環(huán)來處理有符號和無符號整數(shù)。然后,我們可以根據(jù)符號變量的值輸出兩個不同的代碼片段。如果標(biāo)識變量為空(有符號整數(shù))就輸出第一個代碼段,如果不為空(無符號整數(shù)),就輸出第二個代碼段。

在這個例子中,我們用到了簡單的 if/else 語句和 foreach 語句,我們也可以使用一切在 Python 中合法的語句,比如 elif 或者 for 的變體。

執(zhí)行 GYB,會得到 8 個擴(kuò)展,對應(yīng)到每一個固定長度整型變量,范圍從 Int8/Uint8 到 Int64/Uint64。

生成源代碼

你可以從 Swift 倉庫下載 GYB:

wget https://github.com/apple/swift/raw/master/utils/gyb
wget https://github.com/apple/swift/raw/master/utils/gyb.py
chmod +x gyb

通過如下方式解析模板:

bash
./gyb --line-directive '' -o ../Sources/Bitter/Bitter.swift Bitter.swift.gyb

-o選項(xiàng)指定輸出文件,最后一個文件名指定包含模板的文件的名稱。

若 --line-directive ''參數(shù)為缺省,GYB 輸出會增加調(diào)試信息,在原始模板中每一部分的輸出描述元素會被執(zhí)行。

當(dāng)你在調(diào)試自己寫的模板時,調(diào)試信息會很有用。一旦模板完成之后,可以禁用調(diào)試的注釋,讓輸出清爽一些。

要評論?在 Twitter 上戳我。

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,045評論 4 61
  • 上一章 三十四 白沙左手一招,軍令就要傳下。 他身后突地有人大喊一聲,“且慢!”他不由回頭望去,見卻是駱寒山立馬在...
    德萬托阿閱讀 422評論 0 5
  • 過不去的坎別再放在心上 忘不掉的人也該告一段落 新的征途上 愿從今往后的你 別愛的太滿 別睡得太晚
    馬澤凡閱讀 190評論 0 0

友情鏈接更多精彩內(nèi)容