目的:
? 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ī)則戏溺。