本篇會介紹 Coding Style 與 iOS 平台上最活躍的靜態檢查器 SwiftLint,
可以幫助你的程式碼保持一致的風格,並且讓團隊有相同的規範可以遵循。

CodingStyle

CodingStyle 就是指寫作程式碼的風格,其中包含很多面向,
例如說是變數命名方式、是否有空格、是否要換行、註解格式、修飾詞的順序等等,
有時程式碼的功能是相同的,但是會因為風格的不同導致看起來差很多,嚴重一點甚至會有閱讀上的困難,
因此往往成熟的團隊會需要訂定一套規則來規範它。

CodingStyle 規則

CodingStyle 規則就像一份穿搭規則,可以讓團隊裡的程式碼保持下面三個特點。

  1. 可讀性
  2. 易維護
  3. 一致性

自己定義一套穿搭規則其實蠻不容易的,因此可以參考下面兩個網站。

  1. swift.org - API Design Guidelines
    • swift 官方的 API 設計方式,比較偏概念性
  2. raywenderlich - Swift Style
    • raywenderlich 出的一套 CodingStyle,目前算是開源社群裡最多人遵循的的一套規則
    • 定義的規則也相當明確,會跟你說什麼是對的、什麼是錯的

CodingStyle 靜態檢查器

有了穿搭規則還需要一位服裝審核員幫我們檢驗,檢查程式碼是否有依照規則穿搭,
最大的好處是可以自動化地檢查寫作風格是否正確,甚至有些可以幫你自動修正。

SwiftLint

SwiftLint 則是 realm 公司出的一款 CodingStyle 靜態檢查器,
選用此工具原因是目前熱門獨大且唯一持續更新,
而且 SwiftLint 的預設規則就遵循大部分 raywenderlich 的 Swift Style。

安裝方式

  1. 在終端機輸入下方指令,專案初始化pod (請事先電腦安裝過 CocoaPods)

    1
    pod init
  2. 設定 PodFile,開啟專案內的 PodFile 檔案加入下面程式碼

    1
    pod 'SwiftLint'
  3. 在終端機輸入下方指令,安裝三方

    1
    pod install
  4. 設定 Build Phases,開啟專案內設定Build Phases > 按 “+” > RunScript > 輸入下方腳本

    1
    "${PODS_ROOT}/SwiftLint/swiftlint" lint

執行方法

直接按下編譯即可!

禁用規則

1
2
3
4
// swiftlint:disable colon
let noWarning :String = "" // 我被跳過了
// swiftlint:enable colon
let hasWarning :String = "" // 我被禁止了

規則清單

下面連結的每一條都是一條規則,有些是預設有、有些是預設沒有,
並且每一條都有詳細的範例說明怎樣是正確的、怎樣是錯誤的。

Rule Directory

客製化規則

當然有時候會需要調整成適合團隊的規範,請先依照下面步驟調整 Config,
最後細部調整 Config 檔案內的規則即可。

  1. 調整 Build Phases

    1
    "${PODS_ROOT}/SwiftLint/swiftlint" lint --config "${SRCROOT}/swiftlint.yml"
  2. 放入規則設定檔,放在專案的根目錄,叫做”swiftlint.yml”

  3. 一樣直接按下編譯即可!

客製化規則範例

Swiftlint 的客製化規則是非常彈性的,
可以開啟或關閉某些規則,
甚至可以用正規表達式定義全新的規則,
發生不符合規則要觸發”warning”或是”error”也可以自由決定,
也可以跳過固定的路徑的檢查,例如 Pods 裡的三方檔案,避免浪費檢查效能,
最後連報錯的方式也提供很多種,例如 xcode, json … 等等支援各式各樣的報告。

這裡有一個完整範例可以參考:swiftlint.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 不啟用的規則
disabled_rules:
- ...

# 啟用的規則
opt_in_rules:
- ...

# 客製化的規則
custom_rules:

# 執行linting包含的路徑
included:

# 執行linting忽略的路徑(優先度大於included)
excluded:

# 報錯類型
reporter: "xcode"

其他工具

  • tailor:另一套靜態檢查器
    • 但有個嚴重問題,目前只支援到Swift3.0,無人更新…
  • SwiftFormat:強制格式化的工具
    • 尚未深入研究,但能設定的條件不夠多。