SwiftLint - swift代碼規(guī)范工具

目的:

? iOS APP在下一個(gè)版本會(huì)用swift開發(fā),在多人開發(fā)中,即使有官網(wǎng)的規(guī)范模板.但每個(gè)人的代碼風(fēng)格和規(guī)范難以做到完全一致,對后期項(xiàng)目維護(hù)會(huì)增加一定的困難,這里主要是對一個(gè)規(guī)范代碼風(fēng)格工具swiftlint使用的一個(gè)評估.

介紹:

SwiftLint是Realm公司開發(fā)的一個(gè)插件,專門用于管理Swift代碼的規(guī)范,能夠?qū)υ械拇a自動(dòng)格式化,在?Xcode 中執(zhí)行編譯時(shí)驰唬,SwiftLint 會(huì)自動(dòng)運(yùn)行檢查吩屹,不符合規(guī)范的代碼會(huì)通過警告或者報(bào)錯(cuò)的形式指示出來,并且擁有豐富的配置項(xiàng)富弦,可以進(jìn)行大量的自定義規(guī)范操作,是一個(gè)很方便的工具.

?安裝使用:

安裝:

1:可以使用homebrew進(jìn)行全局安裝:

需要在已經(jīng)安裝了homebrew 前提下:

打開終端輸入:

brew install SwiftLint?

2:使用cocoaPods安裝:?

pod?’SwiftLint’,這個(gè)方式可以安裝不同版本的SwiftLint但是只能針對單個(gè)項(xiàng)目.

3:SwiftLint支持pkg安裝包安裝.

使用:

安裝完成后,需要在Xcode中的Build Phases新建一個(gè)?Run Script Phase 配置項(xiàng)添加腳本,

?1:全局安裝添加腳本

if which swiftlint >/dev/null; then

??swiftlint

else

??echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"

fi

2:CocoaPods安裝添加腳本

"${PODS_ROOT}/SwiftLint/swiftlint"

這個(gè)腳本在安裝了swiftlint后每次運(yùn)行都會(huì)執(zhí)行,如果沒有安裝swiftlint,會(huì)警告異巢系樱或者報(bào)錯(cuò).


3:.swiftlint.yml:

這是一個(gè)配置文件,可以通過這個(gè)配置文件來自定義規(guī)則或者修改默認(rèn)規(guī)則.

這里是自用的一個(gè).swiftlint.yml ?配置內(nèi)容


excluded:? # 執(zhí)行 linting 時(shí)忽略的路徑确沸。 優(yōu)先級(jí)比 `included` 更高土陪。

? - Carthage

? - Pods

? - Source/ExcludedFolder

? - Source/ExcludedFile.swift

disabled_rules:# 執(zhí)行時(shí)排除掉的規(guī)則

? - identifier_name? ? # 命名規(guī)則必須按照駝峰原則春寿,與后臺(tái)傳的Json字段命名沖突,建議排除掉

? - trailing_whitespace? # 每一個(gè)空行不能有空格尸诽,會(huì)與Xcode換行后自動(dòng)對齊生成的空格沖突甥材,建議排除掉

? - vertical_whitespace#垂直方向上的空格行,限制為一行(注釋除外)

? - trailing_newline#末尾空行

? - unused_closure_parameter#函數(shù)的參數(shù)必須被使用

? - class_delegate_protocol#delegate protocol 應(yīng)該被設(shè)定為 class-only,才能被弱引用

? - weak_delegate#代理要設(shè)置為弱引用和上面的

? - control_statement#if while 等判斷條件不要用括號(hào) 括起來

? - leading_whitespace#文件末尾不應(yīng)該存在空格符

? - statement_position#else and catch 應(yīng)該與 } 在同一行逊谋,以空格間隔

? - orphaned_doc_comment#注釋要寫在聲明中

? - type_body_length#類型體長度擂达。類型體長度不應(yīng)該跨越太多行,超過200行給warning胶滋,超過350行給error,可自定義

? - notification_center_detachment#移除通知要在 'deinit'中

? - implicit_getter# read-only參數(shù)不應(yīng)該有g(shù)etter方法

? - multiple_closures_with_trailing_closure#當(dāng)函數(shù)有多個(gè)閉包時(shí), 不建議使用尾隨閉包語法

? - trailing_comma# 數(shù)組最后一個(gè)元素后面有逗號(hào)

? - shorthand_operator# 使用+= 板鬓, -=, *=究恤, /=? 代替 a = a + 1

? - file_length#文件長度

? - unneeded_break_in_switch# 在switch-case語句中, 有方法調(diào)用或操作時(shí),避免使用break語句

? - large_tuple#元祖成員

? - redundant_string_enum_value#在定義字符串枚舉的時(shí)候, 當(dāng)字符串枚舉值等于枚舉名稱時(shí)俭令,可以不用賦值

? - implicitly_unwrapped_optional#避免隱式解析可選類型的使用

? - syntactic_sugar#語法糖[Int] 代替Array

? - line_length# 行的字符長度

? - function_parameter_count#函數(shù)參數(shù)個(gè)數(shù) 默認(rèn)5warning 8error

? - cyclomatic_complexity#代碼復(fù)雜度,默認(rèn)為10,循環(huán)復(fù)雜度部宿。函數(shù)體的復(fù)雜度的限制抄腔,這個(gè)屬性主要約束條件句、循環(huán)句中的循環(huán)嵌套問題理张, 當(dāng)嵌套太多的循環(huán)時(shí)赫蛇,則會(huì)觸發(fā)swiftlint中的warning和error,當(dāng)達(dá)到10個(gè)循環(huán)嵌套時(shí)就會(huì)報(bào)warning雾叭,達(dá)到20個(gè)循環(huán)嵌套時(shí)就會(huì)報(bào)error

? - function_body_length#函數(shù)體長度 默認(rèn)超過40行warning

? - closure_parameter_position

? - unused_optional_binding

opt_in_rules: # some rules are only opt-in

? - opening_brace# 右括號(hào)之前應(yīng)有一個(gè)空格悟耘,并與聲明在同一行

? - unused_import# import 的文件要被使用 All imported modules should be required to make the file compile.

#unused_capture_list: error #閉包中沒有被使用的參數(shù)應(yīng)該刪除

#redundant_void_return: error #在不必要的時(shí)候, 不需要寫 ->() and -> Void

operator_whitespace: error #當(dāng)定義空格操作符的時(shí)候织狐,被定義的名字或類型兩邊應(yīng)該各有一個(gè)單行空格操作符

closure_parameter_position: error#閉包參數(shù)位置暂幼, 閉包參數(shù)應(yīng)該和大括號(hào)左邊在同一行

mark: error# //MARK: -

#redundant_optional_initialization: error # 默認(rèn)值賦值為nil

return_arrow_whitespace: error# -> 前后要有空格

#unused_optional_binding: error #在使用if判斷某變量是否為nil的時(shí)候, 不建議使用下劃線(_)

force_unwrapping: error#避免強(qiáng)制解包

force_cast: warning # 類型判斷,這里表示強(qiáng)解類型警告 as! Int

force_try: warning # 對會(huì)拋出異常(throws)的方法,不建議try,強(qiáng)解

trailing_semicolon: error#末尾跟逗號(hào)

legacy_constructor: error #使用 swift 提供的 struct 構(gòu)造函數(shù)移迫, 避免使用 遺留的構(gòu)造函數(shù) 比如 CGPointMake(10, 10)

no_space_in_method_call: error#不要在方法名稱和括號(hào)之間添加空格

empty_count: error #建議使用isEmpty判斷,而不是使用count==0判斷

opening_brace: error #大括號(hào)之前應(yīng)該有一個(gè)空格,且與聲明在同一行

statement_position: error #這里主要指的是 else 和 catch 前面要加一個(gè)空格旺嬉, 也不能大于1個(gè)空格

colon: error #冒號(hào)右側(cè) 有且只有一個(gè)空格

comma: error #逗號(hào)? [a, b, c, d] 后面必須有一個(gè)空格, 前面不要空格

prohibited_interface_builder: error#禁止用interface Builder 創(chuàng)建視圖

protocol_property_accessors_order: error#在協(xié)議中聲明屬性? 要按順序先寫 get set方法

type_name:? #類型名應(yīng)該只包含字母數(shù)字字符, 并且以大寫字母開頭厨埋,長度在3-40個(gè)字符

?min_length:4# 只是警告

?max_length:# 警告和錯(cuò)誤

? warning:60

? error:80

? excluded:#排除 不某些名字不受該規(guī)則控制

#cyclomatic_complexity:

#? warning: 15

#? error: 100 #代碼復(fù)雜度,默認(rèn)為10邪媳,循環(huán)復(fù)雜度。函數(shù)體的復(fù)雜度的限制揽咕,這個(gè)屬性主要約束條件句悲酷、循環(huán)句中的循環(huán)嵌套問題, 當(dāng)嵌套太多的循環(huán)時(shí)亲善,則會(huì)觸發(fā)swiftlint中的warning和error设易,當(dāng)達(dá)到10個(gè)循環(huán)嵌套時(shí)就會(huì)報(bào)warning,達(dá)到20個(gè)循環(huán)嵌套時(shí)就會(huì)報(bào)error

#line_length:? # 單行代碼長度,默認(rèn)error 120

#? warning: 300

#? error: 500

#file_length:? # 文件長度

#? warning: 1000

#? error: 2000

#function_body_length: # 函數(shù)體長度

#? warning: 100

#? error: 200

#large_tuple : #元組成員

#? warning: 6

#? error: 8

可去官方自定查找對應(yīng)屬性說明:

??(GitHub 鏈接:https://github.com/realm/SwiftLint)

4.swiftlint.yml配置文件的嵌套

在我們使用.swift.yml配置文件的時(shí)候蛹头,如果在系統(tǒng)掃描的過程中發(fā)現(xiàn)了一個(gè)新的配置文件顿肺,那么子目錄下的規(guī)則就會(huì)改為新的配置規(guī)則戏溺。

??總的來說,swiftlint對于代碼規(guī)范管理是利遠(yuǎn)大于弊的,只要在前期需要一些時(shí)間建立一個(gè)規(guī)范體系.在后期由于代碼整體的規(guī)范性,能利于項(xiàng)目的維護(hù),以及可以節(jié)省代碼Review的時(shí)間.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屠尊,隨后出現(xiàn)的幾起案子旷祸,更是在濱河造成了極大的恐慌,老刑警劉巖讼昆,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件托享,死亡現(xiàn)場離奇詭異,居然都是意外死亡浸赫,警方通過查閱死者的電腦和手機(jī)闰围,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來既峡,“玉大人羡榴,你說我怎么就攤上這事≡烁遥” “怎么了校仑?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長传惠。 經(jīng)常有香客問我迄沫,道長,這世上最難降的妖魔是什么卦方? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任邢滑,我火速辦了婚禮,結(jié)果婚禮上愿汰,老公的妹妹穿的比我還像新娘。我一直安慰自己乐纸,他們只是感情好衬廷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汽绢,像睡著了一般吗跋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宁昭,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天跌宛,我揣著相機(jī)與錄音,去河邊找鬼积仗。 笑死疆拘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寂曹。 我是一名探鬼主播哎迄,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼回右,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漱挚?” 一聲冷哼從身側(cè)響起翔烁,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旨涝,沒想到半個(gè)月后蹬屹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡白华,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年慨默,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衬鱼。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡业筏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸟赫,到底是詐尸還是另有隱情蒜胖,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布抛蚤,位于F島的核電站台谢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岁经。R本人自食惡果不足惜朋沮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缀壤。 院中可真熱鬧樊拓,春花似錦、人聲如沸塘慕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽图呢。三九已至条篷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛤织,已是汗流浹背赴叹。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留指蚜,地道東北人乞巧。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像姚炕,于是被迫代替她去往敵國和親摊欠。 傳聞我的和親對象是個(gè)殘疾皇子丢烘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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