使用一個Swift代碼風格檢測工具對于一個Swift初學者來說,應(yīng)該算是一個很快了解語言特性的機會菌瘪。
或者說任何一個語言的代碼風格檢測工具都會在某些層面上加強開發(fā)者對于這一門語言的理解。
作為一個OCer微谓,之前一直沉浸于OC的開發(fā)中吏奸,后邊轉(zhuǎn)戰(zhàn)Swift之后,寫代碼的時候總是喜歡帶上一些OC中的特性涛癌,使得代碼和Swift風格總是有些偏差, 感覺是在用OC的思想來寫Swift代碼一樣送火。
每個語言都有很多自己的風格檢測工具拳话,大公司一般會有一套嚴格的代碼風格檢測工具,小公司的話可能大部分都是要靠開發(fā)者自己來把控這個了种吸。
有些時候弃衍,即使你的代碼可以在只有幾個warning的狀態(tài)下流暢的跑起來,但是也并不代表你的代碼沒有很多風格或者語法上的問題坚俗,只是編譯器給你放行了而已镜盯。
工具
圍繞這Swift也有很多第三方的代碼檢測工具岸裙,我找了幾個烈在這里:
Swift Lint
其中star最多的就算是Swift Lint了,所以這次我們也直接選擇這個作為我們代碼風格檢測的工具速缆。
SwiftLint hooks into Clang and SourceKit to use the AST representation of your source files for more accurate results.
安裝
SwiftLint的安裝方法很簡單降允,而且GitHub上也附帶了中文的README。
簡單來說SwiftLint的安裝方法分為兩種模式
- 全局安裝:就是在你的電腦中安裝SwiftLint艺糜,讓你所有的項目都可以享受到SwiftLint的監(jiān)管
- 部分安裝:就是針對于某一個具體的工程進行安裝剧董,不會影響到電腦中的其他項目
其中全局安裝主要就是通過Homebrew來安裝,而部分安裝主要使用過CocoaPods來安裝倦踢。
其中Homebrew安裝時送滞,只要運行以下命令即可
brew install swiftlint
而使用CocoaPods安裝時,只需要和平時一樣在Podfile里加入
pod ‘SwiftLint'
然后再運行
pod install
就可以了辱挥。這里有一個官方的建議:
This will download the SwiftLint binaries and dependencies in Pods/ during your next pod install execution and will allow you to invoke it via {PODS_ROOT}/SwiftLint/swiftlint 在 Script Build Phases 中調(diào)用 SwiftLint。
自從 SwiftLint 支持安裝某個特定版本后边涕,安裝一個指定版本的 SwiftLint 是目前推薦的做法相比較于簡單地選擇最新版本安裝的話(比如通過 Homebrew 安裝的話)晤碘。
請注意這會將 SwiftLint 二進制文件、所依賴的二進制文件和 Swift 二進制庫安裝到 Pods/ 目錄下功蜓,所以不推薦將此目錄添加到版本控制系統(tǒng)(如 git)中進行跟蹤园爷。
使用
首先,為了能夠讓SwiftLint檢查出的問題能夠更好的顯示在IDE上式撼,我們需要在Xcode中配置一個新的腳本童社。
配置新腳本的步驟應(yīng)該不用多少了吧,以防萬一我還是把步驟寫下來吧著隆,圖就不貼了扰楼。
- 點擊Xcode中的項目
- 選擇Targets下的你的項目名稱
- 選擇Build Phases
- 點擊左上角“+”
- 選擇 New Run Script Phase
- 將需要添加的內(nèi)容寫到新生成的Shell文本框里就可以了
如果是使用Homebrew來安裝的話,需要添加如下代碼:
if which swiftlint >/dev/null; then
swiftlint
else
echo “warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint”
fi
而如果使用的是CocoaPods來安裝的美浦,只需要聲明一下:
“${PODS_ROOT}/SwiftLint/swiftlint”
接下來弦赖,就可以使用SwiftLint了,在Xcode中使用CMD+b編譯試試看浦辨,這時候就可以看到滿江紅了蹬竖!
?????????????????
??????????????????????????????????
別急著關(guān)吶!
這才是我們使用SwiftLint的原因啊流酬,看著這些報錯一點一點消失不是會有很大的成就感嗎币厕,而且在這個過程中,你也會學習到很多Swift的語言特性和技巧芽腾。
消除報錯
首先旦装,如果你的項目里引用了很多第三方庫,而這些第三方庫引起了很多SwiftLint的報錯的話晦嵌,我們是不對他負責的同辣,所以我們首先要把第三方庫當中的代碼隔離掉拷姿。
這里我們需要新建一個配置文件,這個文件不僅可以隔離掉第三方代碼旱函,還可以禁用或啟用指定的規(guī)則响巢。
那么接下來,到我們項目的目錄下棒妨,執(zhí)行
touch .swiftlint.yml
有可能你會發(fā)現(xiàn)好像沒有什么變化踪古,沒關(guān)系,因為這個文件是隱藏的券腔,點擊cmd+shift+伏穆。顯示隱藏文件之后,就可以看到他了纷纫。
然后在文件中添加:
excluded:
- Pods
這時候就可以把Pods中的文件排除掉了枕扫,當然這里你還可以添加任何你想要添加的文件或文件夾。
除了隔離之外辱魁,上述說到的很多功能都可以通過這個配置文件來實現(xiàn):
disabled_rules: # 執(zhí)行時排除掉的規(guī)則
- colon
- comma
- control_statement
opt_in_rules: # 一些規(guī)則僅僅是可選的
- empty_count
- missing_docs
# 可以通過執(zhí)行如下指令來查找所有可用的規(guī)則:
# swiftlint rules
included: # 執(zhí)行 linting 時包含的路徑烟瞧。如果出現(xiàn)這個 `—path` 會被忽略。
- Source
excluded: # 執(zhí)行 linting 時忽略的路徑染簇。 優(yōu)先級比 `included` 更高参滴。
- Carthage
- Pods
- Source/ExcludedFolder
- Source/ExcludedFile.swift
# 可配置的規(guī)則可以通過這個配置文件來自定義
# 二進制規(guī)則可以設(shè)置他們的嚴格程度
force_cast: warning # 隱式
force_try:
severity: warning # 顯式
# 同時有警告和錯誤等級的規(guī)則,可以只設(shè)置它的警告等級
# 隱式
line_length: 110
# 可以通過一個數(shù)組同時進行隱式設(shè)置
type_body_length:
- 300 # warning
- 400 # error
# 或者也可以同時進行顯式設(shè)置
file_length:
warning: 500
error: 1200
# 命名規(guī)則可以設(shè)置最小長度和最大程度的警告/錯誤
# 此外它們也可以設(shè)置排除在外的名字
type_name:
min_length: 4 # 只是警告
max_length: # 警告和錯誤
warning: 40
error: 50
excluded: iPhone # 排除某個名字
identifier_name:
min_length: # 只有最小長度
error: 4 # 只有錯誤
excluded: # 排除某些名字
- id
- URL
- GlobalAPIKey
reporter: “Xcode” # 報告類型 (Xcode, json, csv, checkstyle, junit, html, emoji)
接下來再編譯锻弓,你會看到報錯可能會少了很多砾赔,但是還是有很多很多,接下來才是真正的戰(zhàn)斗青灼。
自動更正
什么粒褒?你說你懶得改于游?沒關(guān)系呼奢,SwiftLint也幫你想到了戴已。
你可以通過這個命令,來使用SwiftLint幫你自動修正檢測到的錯誤扳躬。
但是一定一定一定要注意這個命令會覆蓋你之前的內(nèi)容脆诉,所以一定要在跑這個命令之前做好備份。好了接下來可以試試這個命令了贷币。
swiftlint autocorrect
跑完之后击胜,你會發(fā)現(xiàn),報錯已經(jīng)被控制在可以接受的范圍內(nèi)了役纹,這時候你就可以去針對代碼著手修改你的報錯了偶摔,比如
Force Try Violation: Force tries should be avoided. (force_try)
這種使用了try!
的部分,autocorrect是不會幫你修改的促脉。
規(guī)則
在修改報錯的過程中辰斋,我們可以看到每一個報錯或者是警告都會寫出報錯的原因策州,并且在最后會有一個括號,里邊標記了一個詞宫仗,這個詞其實就是SwiftLint的70多條規(guī)則的ID够挂,在這個Rule Directory Reference里,可以直接搜索括號里的內(nèi)容藕夫,這邊會詳細的寫出這個報錯的原因孽糖,以及這條規(guī)則的詳細信息,甚至還會給出引起報錯和未引起報錯的例子毅贮。
那么接下來就去修改你的報錯吧办悟!
最后
在修改報錯的過程中,我覺得對于新入門Swift的人來說滩褥,能夠?qū)W到很多東西病蛉,比如有一些強制裝換的操作,你也會更深刻的去了解某些方法的使用瑰煎,此外對于不規(guī)范的命名以及過長的函數(shù)铡恕,SwiftLint也會讓你去把它進行解耦。
本文章僅限個人學習使用丢间,如果有什么不對的歡迎大佬批評指正。
參考資料
SwiftLint:代碼規(guī)范檢查工具介紹 - 柳云居士 - 博客園