Swift代碼風格檢測

使用一個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 in your Script Build Phases. This is the recommended way to install a specific version of SwiftLint since it supports installing a pinned version rather than simply the latest (which is the case with Homebrew). Note that this will add the SwiftLint binaries, its dependencies’ binaries and the Swift binary library distribution to the Pods/ directory, so checking in this directory to SCM such as git is discouraged. — 在下一次執(zhí)行 pod install 時將會把 SwiftLint 的二進制文件和依賴下載到 Pods/ 目錄下并且將允許你通過{PODS_ROOT}/SwiftLint/swiftlint 在 Script Build Phases 中調(diào)用 SwiftLint。
自從 SwiftLint 支持安裝某個特定版本后边涕,安裝一個指定版本的 SwiftLint 是目前推薦的做法相比較于簡單地選擇最新版本安裝的話(比如通過 Homebrew 安裝的話)晤碘。
請注意這會將 SwiftLint 二進制文件、所依賴的二進制文件和 Swift 二進制庫安裝到 Pods/ 目錄下功蜓,所以不推薦將此目錄添加到版本控制系統(tǒng)(如 git)中進行跟蹤园爷。

使用

首先,為了能夠讓SwiftLint檢查出的問題能夠更好的顯示在IDE上式撼,我們需要在Xcode中配置一個新的腳本童社。

配置新腳本的步驟應(yīng)該不用多少了吧,以防萬一我還是把步驟寫下來吧著隆,圖就不貼了扰楼。

  1. 點擊Xcode中的項目
  2. 選擇Targets下的你的項目名稱
  3. 選擇Build Phases
  4. 點擊左上角“+”
  5. 選擇 New Run Script Phase
  6. 將需要添加的內(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也會讓你去把它進行解耦。

本文章僅限個人學習使用丢间,如果有什么不對的歡迎大佬批評指正。

參考資料

Rule Directory Reference

SwiftLint:代碼規(guī)范檢查工具介紹 - 柳云居士 - 博客園

Xcode代碼規(guī)范之SwiftLint配置 - 簡書

Swift 編碼規(guī)范 | iOS 開發(fā)者論壇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驹针,一起剝皮案震驚了整個濱河市烘挫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬甥,老刑警劉巖饮六,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苛蒲,居然都是意外死亡卤橄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門臂外,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窟扑,“玉大人,你說我怎么就攤上這事漏健『炕酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵蔫浆,是天一觀的道長殖属。 經(jīng)常有香客問我,道長瓦盛,這世上最難降的妖魔是什么洗显? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任外潜,我火速辦了婚禮,結(jié)果婚禮上挠唆,老公的妹妹穿的比我還像新娘处窥。我一直安慰自己,他們只是感情好损搬,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布碧库。 她就那樣靜靜地躺著,像睡著了一般巧勤。 火紅的嫁衣襯著肌膚如雪嵌灰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天颅悉,我揣著相機與錄音沽瞭,去河邊找鬼。 笑死剩瓶,一個胖子當著我的面吹牛驹溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播延曙,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豌鹤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枝缔?” 一聲冷哼從身側(cè)響起布疙,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愿卸,沒想到半個月后灵临,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡趴荸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年儒溉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片发钝。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顿涣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笼平,到底是詐尸還是另有隱情园骆,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布寓调,位于F島的核電站锌唾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晌涕,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一滋捶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧余黎,春花似錦重窟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垮衷,卻和暖如春厅翔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搀突。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工刀闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仰迁。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓甸昏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徐许。 傳聞我的和親對象是個殘疾皇子施蜜,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容