1.swiftlint簡介
SwiftLint 是 Realm 推出的一款 Swift 代碼規(guī)范檢查工具(Realm推出過一款跨平臺(tái)的移動(dòng)端數(shù)據(jù)庫)。
SwiftLint 基于 Github 公布的 Swift 代碼規(guī)范進(jìn)行代碼檢查,并且能夠很好的和 Xcode 整合。配置好所有的設(shè)置之后,在 Xcode 中執(zhí)行編譯時(shí),SwiftLint 會(huì)自動(dòng)運(yùn)行檢查,不符合規(guī)范的代碼會(huì)通過警告或者 error 的形式指示出來,并且擁有豐富的配置項(xiàng),可以進(jìn)行大量的自定義,相當(dāng)方便。
2.swiftlint安裝
SwiftLint 有多種不同的安裝方式,可以根據(jù)自己的喜好選擇。
2.1使用 Homebrew 安裝
Homebrew 是 macOS 自帶的包管理工具,使用這種方式安裝也是最簡單的:
brew install swiftlint
如果swiftlint版本較低,可以升級(jí)(命令:brew upgrade swiftlint)
2.2使用 CocoaPods 安裝
通過 CocoaPods 安裝同樣很簡單,只需要在 Podfile 中添加依賴:
pod 'SwiftLint'
之后執(zhí)行 pod install 就可以自動(dòng)安裝了,這種方式會(huì)將 SwiftLint 安裝到項(xiàng)目的 Pods/ 目錄下。如果你想要針對不同的項(xiàng)目使用不同的 SwiftLint 版本,這是一種很好的解決方案(Homebrew 會(huì)自動(dòng)安裝最新版本)。
需要注意的是使用這種方案會(huì)將整個(gè) ** SwiftLint** 以及他的依賴包的完整資源文件都安裝到 Pods/ 目錄中去,所以在使用版本管理工具比如 git 時(shí)要注意設(shè)置忽略相關(guān)目錄。
2.3使用安裝包
SwiftLint 還支持使用 pkg 安裝包進(jìn)行安裝,在官方的 Github 頁面可以找到最新發(fā)布的安裝包。
2.4編譯源代碼
SwiftLint 完全使用 Swift 開發(fā),并且它是基于 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
接下來需要在工程中配置相關(guān)編譯選項(xiàng),才能使 SwiftLint 在 Xcode 中運(yùn)行起來。配置也很簡單,只需要在 Xcode 的 Build Phases 中新建一個(gè) Run Script Phase 配置項(xiàng),在里面添加如下代碼:
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"
這里其實(shí)是設(shè)置了一個(gè)自動(dòng)編譯腳本,每次運(yùn)行編譯都會(huì)自動(dòng)執(zhí)行這個(gè)腳本,如果正確安裝了 SwiftLint,就會(huì)執(zhí)行 SwiftLint 中的代碼規(guī)范檢查,如果沒有安裝,腳本會(huì)拋出一個(gè)沒有安裝 SwiftLint 并提示下載的警告,方便提醒團(tuán)隊(duì)團(tuán)隊(duì)中沒有安裝的成員。
當(dāng)然,你也可以設(shè)置為強(qiáng)制要求安裝,這時(shí)如果沒有安裝則無法通過編譯。只需要在腳本中 echo "warning: ..." 之后添加一行代碼:exit 1,這樣一來,如果沒有安裝 SwiftLint,編譯時(shí)會(huì)直接拋出一個(gè)編譯錯(cuò)誤而非警告,提示需要安裝 SwiftLint。
到此配置就完成了,可以通過command+B/R來自動(dòng)檢查代碼規(guī)范了(此時(shí)是默認(rèn)代碼的規(guī)則)。
4.swiftlint規(guī)則
前面集成了swiftlint之后,那么我們?nèi)绾卧陧?xiàng)目中對我們的代碼做自定義的代碼規(guī)范檢查呢?這里就需要?jiǎng)?chuàng)建代碼規(guī)范的配置文件:.swiftlint.yml了。
4.1.配置.swiftlint.yml文件
- 1>cd到主工程目錄下,創(chuàng)建文件
touch .swiftlint.yml
- 2>打開文件(Command+Shift+.可顯示隱藏文件)并編輯,以下為本人編輯的規(guī)則文件僅供參考
excluded:
- Pods
disabled_rules:
- trailing_whitespace # 每一個(gè)空行不能有空格,會(huì)與Xcode換行后自動(dòng)對齊生成的空格沖突,建議排除掉加。
- missing_docs # 缺失說明注釋, 官方解釋:”Public declarations should be documented.”, 公共聲明應(yīng)該被注釋/標(biāo)記。 在函數(shù)聲明的時(shí)候, 一般情況下, 帶public關(guān)鍵字的函數(shù)的注釋只能用 “///”和 “/* /”來注釋, 如果不帶public關(guān)鍵字的函數(shù)只能用 “//”和 “/* */” 。這個(gè)屬性應(yīng)該禁用,沒必要?。?!
- function_parameter_count # 函數(shù)參數(shù)計(jì)數(shù)違例:函數(shù)應(yīng)該有5個(gè)參數(shù),多余會(huì)報(bào)錯(cuò) 函數(shù)參數(shù)個(gè)數(shù), 函數(shù)參數(shù)數(shù)量(init方法除外)應(yīng)該少點(diǎn), 不要太多,swiftlint規(guī)定函數(shù)參數(shù)數(shù)量超過5個(gè)給warning, 超過8個(gè)直接報(bào)error。這個(gè)屬性推薦使用, 由于簡單就不舉例了。注:function_parameter_count: error 這樣并不能改變它的警告或錯(cuò)誤,該屬性不允許修改,但是可以禁用
- identifier_name #命名規(guī)則必須按照駝峰原則(可能model中的某些字段與json字段命名沖突,建議排除掉)
- type_name #類型命名規(guī)則限制,以大寫字母開頭,且長度在1到20個(gè)字符之間
- shorthand_operator #使用+= , -=, *=, /= 代替 a = a + 1
- large_tuple #元祖成員 元組沖突:元組應(yīng)該最多有2個(gè)成員,多余兩個(gè)會(huì)報(bào)錯(cuò)
- for_where #使用 `for where` 代替 簡單的 `for { if }`
- class_delegate_protocol #delegate protocol 應(yīng)該被設(shè)定為 class-only,才能被弱引用
- todo #避免 TODOs and FIXMEs 標(biāo)識(shí)
cyclomatic_complexity: 20 #代碼復(fù)雜度,默認(rèn)為10
force_try: warning # try語句判斷
force_cast: warning # 強(qiáng)制轉(zhuǎn)換(代碼中存在一些前面通過if判斷過類型,后面做的強(qiáng)制轉(zhuǎn)換的代碼)
line_length: #每行長度限制
warning: 160
error: 300
ignores_function_declarations: true
ignores_comments: true
file_length: #文件長度
warning: 1000
error: 1500
function_body_length: #函數(shù)體長度
warning: 100
error: 150
type_body_length: #類的長度
warning: 800
error: 1200
- 3>swiftlint.yml關(guān)鍵字說明
disabled_rules:禁用指定的規(guī)則
opt_in_rules:啟動(dòng)指定的規(guī)則
whitelist_rules:白名單規(guī)則,不能和上面兩項(xiàng)混用
included:希望Lint檢索的路徑,SwiftLint會(huì)掃描該路徑下的所有.swift后綴的文件
excluded: 希望不要檢索的路徑,SwiftLint會(huì)無視掉該路徑下的文件,一般比如Pods、Carthage或者一些三方庫
4>swiftlint.yml配置文件的嵌套
在我們使用.swift.yml配置文件的時(shí)候,如果在系統(tǒng)掃描的過程中發(fā)現(xiàn)了一個(gè)新的配置文件,那么子目錄下的規(guī)則就會(huì)改為新的配置規(guī)則。5>代碼中若要禁用規(guī)則,需要首先拿到某個(gè)規(guī)則的 ID。全局安裝的 Swift Lint 可以在 Terminal 輸入 swiftlint rules 查看所有可獲得的規(guī)則以及對應(yīng)的 ID;未全局安裝的 Swift Lint 也可以直接在警告或錯(cuò)誤提示末尾的小括號(hào)中找到其對應(yīng)的 ID。
在代碼中即可使用以下注釋禁用或開啟相應(yīng)的規(guī)則。
// 作用于該文件該行以下(除非遇到同一規(guī)則的 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默認(rèn)規(guī)則介紹:
官方規(guī)則文檔:https://realm.github.io/SwiftLint/
騰訊云翻譯規(guī)則文檔(推薦):
https://cloud.tencent.com/developer/article/1617958
4.3.swiftlint命令行介紹
--version 查看版本號(hào)
-h, --help 幫助
SUBCOMMANDS:
analyze 執(zhí)行規(guī)則分析
docs 瀏覽器打開swiftlint規(guī)則官網(wǎng)
generate-docs 為所有規(guī)則生成markdown文件
lint (default) 打印警告和錯(cuò)誤
rules 顯示所有規(guī)則
version 顯示版本號(hào)
autocorrect 將已知的能夠自動(dòng)修復(fù)的Error和Warning都自動(dòng)修復(fù),一般舊的項(xiàng)目配置SwiftLint之后會(huì)出現(xiàn)大量的報(bào)錯(cuò)和警告,此命令可減少大部分工作量)
附參考:
SwiftLint GitHub地址:https://github.com/realm/SwiftLint
SwiftLint 官網(wǎng)說明.:https://realm.github.io/SwiftLint/index.html
swift代碼規(guī)范工具:http://www.itdecent.cn/p/eea2520f34ae
iOS- 工程配置SwiftLint:https://www.it610.com/article/1282270515729285120.htm
SwiftLint 規(guī)則:https://cloud.tencent.com/developer/article/1617958
http://www.itdecent.cn/p/abb4057db849