swiftlint使用指南

1.swiftlint簡介

SwiftLintRealm 推出的一款 Swift 代碼規范檢查工具(Realm推出過一款跨平臺的移動端數據庫)。
SwiftLint 基于 Github 公布的 Swift 代碼規范進行代碼檢查,并且能夠很好的和 Xcode 整合。配置好所有的設置之后,在 Xcode 中執行編譯時,SwiftLint 會自動運行檢查,不符合規范的代碼會通過警告或者 error 的形式指示出來,并且擁有豐富的配置項,可以進行大量的自定義,相當方便。

2.swiftlint安裝

SwiftLint 有多種不同的安裝方式,可以根據自己的喜好選擇。

2.1使用 Homebrew 安裝

Homebrew 是 macOS 自帶的包管理工具,使用這種方式安裝也是最簡單的:

brew install swiftlint

如果swiftlint版本較低,可以升級(命令:brew upgrade swiftlint)

2.2使用 CocoaPods 安裝

通過 CocoaPods 安裝同樣很簡單,只需要在 Podfile 中添加依賴:

pod 'SwiftLint'

之后執行 pod install 就可以自動安裝了,這種方式會將 SwiftLint 安裝到項目的 Pods/ 目錄下。如果你想要針對不同的項目使用不同的 SwiftLint 版本,這是一種很好的解決方案(Homebrew 會自動安裝最新版本)。

需要注意的是使用這種方案會將整個 ** SwiftLint** 以及他的依賴包的完整資源文件都安裝到 Pods/ 目錄中去,所以在使用版本管理工具比如 git 時要注意設置忽略相關目錄。

2.3使用安裝包

SwiftLint 還支持使用 pkg 安裝包進行安裝,在官方的 Github 頁面可以找到最新發布的安裝包

2.4編譯源代碼

SwiftLint 完全使用 Swift 開發,并且它是基于 MIT License 開源的,所以你可以下載它的源代碼,然后通過以下命令編譯安裝:

git submodule update --init --recursive; make install
2.5安裝完成

等待安裝完成,輸入 swiftlint help 可以查看所有可用的命令:

?  ~ swiftlint help
Available commands:

   autocorrect   Automatically correct warnings and errors
   help          Display general or command-specific help
   lint          Print lint warnings and errors (default command)
   rules         Display the list of rules and their identifiers
   version       Display the current version of SwiftLint

到此 SwiftLint 就安裝完成了

3.配置 Xcode

接下來需要在工程中配置相關編譯選項,才能使 SwiftLint 在 Xcode 中運行起來。配置也很簡單,只需要在 Xcode 的 Build Phases 中新建一個 Run Script Phase 配置項,在里面添加如下代碼:

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

如圖所示:
[圖片上傳失敗...(image-933261-1580636760609)]

如果是通過 CocoaPods 安裝的 SwiftLint ,腳本替換為 CocoaPods 中的路徑:

"${PODS_ROOT}/SwiftLint/swiftlint"

這里其實是設置了一個自動編譯腳本,每次運行編譯都會自動執行這個腳本,如果正確安裝了 SwiftLint,就會執行 SwiftLint 中的代碼規范檢查,如果沒有安裝,腳本會拋出一個沒有安裝 SwiftLint 并提示下載的警告,方便提醒團隊團隊中沒有安裝的成員。
當然,你也可以設置為強制要求安裝,這時如果沒有安裝則無法通過編譯。只需要在腳本中 echo "warning: ..." 之后添加一行代碼:exit 1,這樣一來,如果沒有安裝 SwiftLint,編譯時會直接拋出一個編譯錯誤而非警告,提示需要安裝 SwiftLint
到此配置就完成了,可以通過command+B/R來自動檢查代碼規范了(此時是默認代碼的規則)。

4.swiftlint規則

前面集成了swiftlint之后,那么我們如何在項目中對我們的代碼做自定義的代碼規范檢查呢?這里就需要創建代碼規范的配置文件:.swiftlint.yml了。

4.1.配置.swiftlint.yml文件
  • 1>cd到主工程目錄下,創建文件
touch .swiftlint.yml
  • 2>打開文件(Command+Shift+.可顯示隱藏文件)并編輯,以下為本人編輯的規則文件僅供參考
excluded:
  - Pods
disabled_rules:
    - trailing_whitespace # 每一個空行不能有空格,會與Xcode換行后自動對齊生成的空格沖突,建議排除掉加。
    - missing_docs # 缺失說明注釋, 官方解釋:”Public declarations should be documented.”, 公共聲明應該被注釋/標記。 在函數聲明的時候, 一般情況下, 帶public關鍵字的函數的注釋只能用 “///”和 “/* /”來注釋, 如果不帶public關鍵字的函數只能用 “//”和 “/* */” 。這個屬性應該禁用,沒必要!!!
    - function_parameter_count # 函數參數計數違例:函數應該有5個參數,多余會報錯 函數參數個數, 函數參數數量(init方法除外)應該少點, 不要太多,swiftlint規定函數參數數量超過5個給warning, 超過8個直接報error。這個屬性推薦使用, 由于簡單就不舉例了。注:function_parameter_count: error 這樣并不能改變它的警告或錯誤,該屬性不允許修改,但是可以禁用
    - identifier_name   #命名規則必須按照駝峰原則(可能model中的某些字段與json字段命名沖突,建議排除掉)
    - type_name #類型命名規則限制,以大寫字母開頭,且長度在1到20個字符之間
    - shorthand_operator #使用+= , -=, *=, /=  代替 a = a + 1
    - large_tuple #元祖成員 元組沖突:元組應該最多有2個成員,多余兩個會報錯
    - for_where #使用 `for where` 代替 簡單的 `for { if }`
    - class_delegate_protocol #delegate protocol 應該被設定為 class-only,才能被弱引用
    - todo #避免 TODOs and FIXMEs 標識
cyclomatic_complexity: 20 #代碼復雜度,默認為10
force_try: warning # try語句判斷
force_cast: warning # 強制轉換(代碼中存在一些前面通過if判斷過類型,后面做的強制轉換的代碼)
line_length:    #每行長度限制
  warning: 160
  error: 300
  ignores_function_declarations: true
  ignores_comments: true
file_length:    #文件長度
  warning: 1000
  error: 1500
function_body_length:   #函數體長度
  warning: 100
  error: 150
type_body_length:   #類的長度
  warning: 800
  error: 1200
  • 3>swiftlint.yml關鍵字說明
disabled_rules:禁用指定的規則
opt_in_rules:啟動指定的規則
whitelist_rules:白名單規則,不能和上面兩項混用
included:希望Lint檢索的路徑,SwiftLint會掃描該路徑下的所有.swift后綴的文件
excluded: 希望不要檢索的路徑,SwiftLint會無視掉該路徑下的文件,一般比如Pods、Carthage或者一些三方庫
  • 4>swiftlint.yml配置文件的嵌套
    在我們使用.swift.yml配置文件的時候,如果在系統掃描的過程中發現了一個新的配置文件,那么子目錄下的規則就會改為新的配置規則。

  • 5>代碼中若要禁用規則,需要首先拿到某個規則的 ID。全局安裝的 Swift Lint 可以在 Terminal 輸入 swiftlint rules 查看所有可獲得的規則以及對應的 ID;未全局安裝的 Swift Lint 也可以直接在警告或錯誤提示末尾的小括號中找到其對應的 ID。
    在代碼中即可使用以下注釋禁用或開啟相應的規則。

// 作用于該文件該行以下(除非遇到同一規則的 enable,disable)
// swiftlint:disable <rule1> [<rule2> <rule3>...]
// swiftlint:enable <rule1> [<rule2> <rule3>...]

// eg:
// swiftlint:disable trailing_whitespace vertical_whitespace
// swiftlint:enable trailing_whitespace

// 作用于下一(next),這一(this),上一(previous)行
// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
4.2.swiftlint默認規則介紹:

官方規則文檔:https://realm.github.io/SwiftLint/
騰訊云翻譯規則文檔(推薦):
https://cloud.tencent.com/developer/article/1617958

4.3.swiftlint命令行介紹
  --version               查看版本號
  -h, --help              幫助

SUBCOMMANDS:
  analyze                 執行規則分析
  docs                    瀏覽器打開swiftlint規則官網
  generate-docs           為所有規則生成markdown文件
  lint (default)          打印警告和錯誤
  rules                   顯示所有規則
  version                 顯示版本號
  autocorrect             將已知的能夠自動修復的Error和Warning都自動修復,一般舊的項目配置SwiftLint之后會出現大量的報錯和警告,此命令可減少大部分工作量)

附參考:
SwiftLint GitHub地址:https://github.com/realm/SwiftLint

SwiftLint 官網說明.:https://realm.github.io/SwiftLint/index.html

swift代碼規范工具:http://www.lxweimin.com/p/eea2520f34ae

iOS- 工程配置SwiftLint:https://www.it610.com/article/1282270515729285120.htm

SwiftLint 規則:https://cloud.tencent.com/developer/article/1617958

http://www.lxweimin.com/p/abb4057db849

http://www.lxweimin.com/p/c8337160fcd4

http://www.cocoachina.com/articles/19415

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容