1.swiftlint簡介
SwiftLint 是 Realm 推出的一款 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