(一)什么是SwiftLint 痰驱?
熟悉Python的同學(xué)一定對(duì)Pylint不會(huì)陌生,Pylint 是一個(gè) Python 代碼分析工具瞳浦,它分析 Python 代碼中的錯(cuò)誤,查找不符合代碼風(fēng)格標(biāo)準(zhǔn)(Pylint 默認(rèn)使用的代碼風(fēng)格是 PEP 8废士,具體信息叫潦,請(qǐng)參閱參考資料)和有潛在問(wèn)題的代碼。Python是一門(mén)很強(qiáng)調(diào)格式的語(yǔ)言官硝,畢竟人家連大括號(hào)都沒(méi)有矗蕊,反觀Swift,似乎不按照嚴(yán)格的規(guī)范編碼也沒(méi)有太大的問(wèn)題氢架?錯(cuò)傻咖!寫(xiě)出良好代碼風(fēng)格的代碼,可能比能否寫(xiě)出高效的代碼更為重要岖研。于是卿操,SwiftLint就誕生了警检。SwiftLint是一個(gè)強(qiáng)制使用者按照Github的Swift編碼規(guī)范指南來(lái)開(kāi)發(fā)的一種工具,它會(huì)將所有不符合Swift規(guī)范的代碼全部用warning標(biāo)注出來(lái)害淤,一些嚴(yán)重的違背規(guī)則的代碼甚至讓它無(wú)法通過(guò)編譯(江山一片紅)扇雕,想想是不是就很刺激呢?
(二)為什么需要Lint 窥摄?
1.獨(dú)行俠的困局
如果你是個(gè)人開(kāi)發(fā)镶奉,或者說(shuō)團(tuán)隊(duì)沒(méi)有CodeReview,那么你的代碼絕對(duì)不是“完美”的崭放。人總是會(huì)犯錯(cuò)的哨苛,尤其是在高速的迭代和業(yè)務(wù)需求快速變更的時(shí)候,犯錯(cuò)的幾率會(huì)成倍的增加币砂。最讓人尷尬的是建峭,Xcode是非常包容的,即使你的代碼不符合規(guī)范道伟,但是如果語(yǔ)法是沒(méi)有問(wèn)題的迹缀,那么它也會(huì)特別樂(lè)意的讓你通過(guò)編譯并且沒(méi)有任何的警告。
但是蜜徽,但凡你是一個(gè)有追求的開(kāi)發(fā)者祝懂,都會(huì)希望自己所寫(xiě)出來(lái)的代碼,至少在代碼風(fēng)格上面無(wú)可挑剔拘鞋。但是這又和現(xiàn)實(shí)世界的開(kāi)發(fā)需求以及人性相矛盾砚蓬,所以這就是一個(gè)困局。
2.CodeReview之殤
有幸盆色,你所處在的公司是一個(gè)有技術(shù)追求的公司灰蛙。那么,你們一定會(huì)有大量的互相Review隔躲。在我看來(lái)摩梧,CodeReview一般做這樣幾件事情:
- 代碼風(fēng)格規(guī)范統(tǒng)一
- 防止低效代碼、冗余代碼
- 防止出現(xiàn)可見(jiàn)的明顯BUG
第二第三點(diǎn)宣旱,其中富含了大量人腦的思考仅父,屬于暫時(shí)還無(wú)法替代的操作(AI時(shí)代應(yīng)該可以)。但是第一點(diǎn)浑吟,實(shí)在屬于機(jī)械操作笙纤,就好像第一次工業(yè)革命的人工織布,是處在必然被淘汰的行列组力。
在這樣的時(shí)代浪潮之下省容,SwiftLint 應(yīng)運(yùn)而生。
(三) 安裝
沒(méi)有辦法燎字,按照技術(shù)文章的三板斧:安裝 - 使用 - 踩坑腥椒,這是怎么也繞不過(guò)去的一章阿宅。我相信讀者都聰慧無(wú)比,但是為了文章的完整性我還是要啰嗦幾句寞酿。
(1) 全局安裝
全局安裝就不得不提到我們的老朋友HomeBrew了家夺,如果你沒(méi)有安裝,那么請(qǐng)看這里伐弹。
全局安裝非常簡(jiǎn)單,首先我們需要通過(guò)brew
命令安裝SwiftLint
:
brew install swiftlint
然后添加編譯腳本:
最后在黑框框中添加如下腳本:
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
即
OK拉馋,大功告成,就可以編譯啦惨好,之后每次安裝只需要給工程添加腳本就可以了煌茴。
(2) 局部安裝
除了全局安裝,我們也可以通過(guò)CocoaPods進(jìn)行安裝日川。在Podfile上添加相關(guān)的依賴(lài):
pod 'SwiftLint'
然后跟全局方法一樣蔓腐,在Run Script
中添加命令,但是內(nèi)容有些許的不同:
"${PODS_ROOT}/SwiftLint/swiftlint"
OK,接下來(lái)就讓我們來(lái)試試看SwiftLint吧龄句!
(三)使用
在給項(xiàng)目初次接入SwiftLint的時(shí)候回论,你可能會(huì)被下面這樣的情景給嚇到:
但是呢,不用慌分歇,我們可以看一下這是什么情況傀蓉。仔細(xì)觀察一番之后,我們會(huì)發(fā)現(xiàn)职抡,絕大多數(shù)的Warning都是這個(gè)原因:
WTF葬燎?我這一行哪里有空格符?簡(jiǎn)直就是冤枉案克Α谱净!但其實(shí)是這樣的,雖然看起來(lái)好像沒(méi)有空格符擅威,但是在換行符之間不應(yīng)該摻雜制表符壕探,也就是說(shuō)你實(shí)際的代碼是這樣的:
\n \tab \n
所以呢,人家的Warning也不是沒(méi)有道理的嘛郊丛。那么我們?cè)撛趺磥?lái)消除這些Warning呢浩蓉?
首先,我們要確保宾袜,以后我們所碼的代碼不再出現(xiàn)這樣的格式,所以我們需要把Text Editing
里面的Including whitespace-only lines
勾選上:
這樣可以保證我們今后的換行不再出現(xiàn)制表符的警告驾窟,然后庆猫,我們就需要處理現(xiàn)有的代碼。現(xiàn)有的代碼绅络,少說(shuō)也有幾萬(wàn)行月培,手動(dòng)改不是要累死人嘁字?這個(gè)時(shí)候就輪到SwiftLint的命令行出場(chǎng)了:
我們將目錄切換到工程的根目錄之下,然后敲擊如下命令:
swiftlint autocorrect
然后我們就會(huì)發(fā)現(xiàn)杉畜,所有的空格符Warning都消失了纪蜒。這都得益于我們剛剛所進(jìn)行的命令行操作,它會(huì)將已知的能夠自動(dòng)修復(fù)的Error和Warning都自動(dòng)修復(fù)此叠,大大的減輕了我們的工作量纯续。
但是又出現(xiàn)了一個(gè)問(wèn)題,在項(xiàng)目的根目錄之下執(zhí)行自動(dòng)糾正灭袁,SwiftLint會(huì)將Pods文件夾中的Swift文件也一起糾正了猬错,第三方的框架原則上能不動(dòng)就不動(dòng),那么我們?cè)撛趺崔k呢茸歧?
這個(gè)時(shí)候就需要.swiftlint.yml
文件了倦炒。那么這是一個(gè)什么文件呢?在使用SwiftLint的時(shí)候软瞎,很多時(shí)候我們會(huì)碰到一些自定義的規(guī)則需求逢唤,這個(gè)時(shí)候就需要.swiftlint.yml
來(lái)解決問(wèn)題了。
.swiftlint.yml
所謂的.swiftlint.yml
其實(shí)就是SwiftLint的一個(gè)配置文件涤浇,我們可以通過(guò)這個(gè)配置文件來(lái)修改約束的規(guī)則鳖藕,以此達(dá)到自定義的效果。
一般的配置文件大概長(zhǎng)這個(gè)樣子:
下面我們來(lái)認(rèn)識(shí)一下主要的幾個(gè)配置選項(xiàng),在此之前我們先要了解一下SwiftLint中的一個(gè)概念rules
,所謂的rules
就是一個(gè)一個(gè)的風(fēng)格規(guī)則芙代,比如冒號(hào)的規(guī)則吊奢,空格符的規(guī)則,類(lèi)型名的規(guī)則等等纹烹。截止目前页滚,SwiftLint一共支持75種規(guī)則,如果你感興趣铺呵,可以在Source/SwiftLintFramework/Rules 中看到所有規(guī)則的實(shí)現(xiàn)裹驰。或者你也可以在終端輸入swiftlint rules
來(lái)查看當(dāng)前的規(guī)則信息片挂。
disabled_rules
disabled_rules: # 禁用指定的規(guī)則
- file_length
- ...
opt_in_rules
opt_in_rules: # 啟用指定的規(guī)則
- file_length
- ...
whitelist_rules
whitelist_rules: # 規(guī)則的白名單幻林,但是不能和上面兩個(gè)規(guī)則一起使用
- file_length
- ...
included
included: # 你所希望Lint檢索的路徑,SwiftLint會(huì)掃描該路徑下的所有.swift后綴的文件
- ../
excluded
excluded: # 你所希望不要檢索的路徑,SwiftLint會(huì)無(wú)視掉該路徑下的文件
- Pods
風(fēng)格規(guī)則
由于風(fēng)格規(guī)則太多了音念,這里不一一列舉沪饺,但是用法都是大致相同的:
force_cast: [warning | error] 當(dāng)出現(xiàn)強(qiáng)制類(lèi)型轉(zhuǎn)換的時(shí)候是提示Error還是Warning
type_body_length:
- 300 # 當(dāng)超過(guò)300行的時(shí)候飚黃
- 400 # 當(dāng)超過(guò)400行的時(shí)候飚紅
** 還有很多的規(guī)則,用法大致相同闷愤,讀者如此聰慧整葡,老夫不必多言。 **
注釋控制
還有一個(gè)場(chǎng)景讥脐,有的時(shí)候遭居,我們并不想大范圍的禁用掉一個(gè)規(guī)則啼器,但是在某個(gè)文件中,我們必須要無(wú)視這條規(guī)則俱萍,那么我們應(yīng)該怎么告訴SwiftLint來(lái)無(wú)視掉它呢端壳?
** 很簡(jiǎn)單,注釋?zhuān)?*
比如以下這種情況:
哇枪蘑,這個(gè)是系統(tǒng)給的代理方法啊损谦,竟然還警告我方法名稱(chēng)過(guò)長(zhǎng)!難道無(wú)視他腥寇?不行成翩,強(qiáng)迫癥患者忍受不了啊赦役!
于是我們可以這樣:
OK,這樣在// swiftlint:disable line_length
注釋之后的所有行長(zhǎng)的警告都會(huì)被忽略掉麻敌。如果你想要在忽略掉這一行之后再次啟用,那么只要再添加一行// swiftlint:enable line_length
就可以了掂摔。
如果你覺(jué)得势誊,有很多的控制注釋也看起來(lái)不順眼的話(huà)储藐,個(gè)人推薦可以這樣锅移,把它寫(xiě)在開(kāi)頭的注釋上:
或者更加的極端:
配置文件的嵌套
值得一提的是互婿,在我們使用配置文件的時(shí)候,SwiftLint會(huì)默認(rèn)將所指定的文件目錄遞歸的掃描下去的叭披。如果掃描過(guò)程中寥殖,在子目錄下發(fā)現(xiàn)了一個(gè)新的.swiftlint.yml
文件,那么子目錄下的規(guī)則就會(huì)改為新的配置規(guī)則涩蜘。聽(tīng)起來(lái)很實(shí)用嚼贡,但是本人還沒(méi)用過(guò)??。
(四)踩坑
在本人使用該Lint的這段時(shí)間中同诫,發(fā)現(xiàn)有兩個(gè)使用麻煩的地方粤策,分享出來(lái)。
一號(hào)建議
注釋控制在實(shí)際的使用中非常的常用误窖,所以強(qiáng)烈建議使用代碼塊來(lái)簡(jiǎn)化操作:
二號(hào)建議
在實(shí)際的使用中叮盘,.swiftlint.yml
的創(chuàng)建也是非常頻繁的,尤其是如果你是通過(guò)模塊化的開(kāi)發(fā)霹俺,那么每當(dāng)新建一個(gè)模塊或者給一個(gè)模塊添加Lint的時(shí)候柔吼,你就需要?jiǎng)?chuàng)建至少一個(gè)YML文件,所以個(gè)人建議可以給SwiftLint添加一個(gè)輔助的命令行丙唧。
我使用Swift簡(jiǎn)單實(shí)現(xiàn)了一個(gè)Maker,將其編譯之后的二進(jìn)制可執(zhí)行文件拷貝到/usr/local/bin
之后就可以使用了嚷堡。
之后我們通過(guò)下面的命令就可以快速的創(chuàng)建一個(gè)YML文件,我們只需要在模板文件的基礎(chǔ)上進(jìn)行修改就可以了:
maker -y
編譯方法
有同學(xué)說(shuō),不知道怎么使用Maker
,這里簡(jiǎn)單介紹一下蝌戒,其實(shí)發(fā)布APP類(lèi)似:
1.Xcode編譯方案
首先我們打開(kāi)Maker工程,然后點(diǎn)擊Archive
(簽名的事情自己搞定罢恿稹):
稍等片刻北苟,我們的程序就編譯完成了,然后步驟如下:
最后只需要兩句命令:
2.命令行編譯方案
第二種方法直接通過(guò)純命令的方式,更加簡(jiǎn)單:
cd path # 這里的path是指main.swift所在的文件目錄之下
swiftc main.swift Maker.swift -o Maker # 編譯生成二進(jìn)制文件
cp Maker /usr/local/bin # 復(fù)制到目標(biāo)目錄之下
OK打瘪! 大功告成友鼻! 快試試Maker吧!
這樣對(duì)我這種記性不太好的人來(lái)說(shuō)就友好了許多o( ̄▽?zhuān)?d闺骚,其實(shí)講道理應(yīng)該發(fā)布HomeBrew之類(lèi)的地方更加方便彩扔,但是功能太簡(jiǎn)單不好意思,就隨便搞了搞僻爽,以后加了其他功能可能會(huì)考慮虫碉。
順便說(shuō)一嘴,在Xcode插件被禁用之后胸梆,很多好用的功能都離我們遠(yuǎn)去了敦捧,但是這并不是意味著工作效率的降低。比如上述的命令行工具碰镜,更多的旨在拋磚引玉兢卵,主旨都是為了加快我們的開(kāi)發(fā)效率,所以不要再只把Swift當(dāng)做iOS開(kāi)發(fā)語(yǔ)言了哦绪颖!
Ending
由此可見(jiàn)秽荤,SwiftLint 使用起來(lái)對(duì)于開(kāi)發(fā)者也是比較有好的。但凡是一個(gè)有代碼潔癖的iOS程序員柠横,都可以來(lái)試試這個(gè)SwiftLint,我相信你絕對(duì)不會(huì)后悔了窃款。在漫長(zhǎng)的求職路上,我希望你不要因?yàn)榇a風(fēng)格問(wèn)題被面試刷掉滓鸠。
最后的最后雁乡,祝愿世界上所有的代碼都能如詩(shī)般優(yōu)雅整潔??。