SwiftLint を導入する

このページは

SwiftLint について、導入する方法と使い方を簡単に記す。

もっと詳しく知りたい場合は SwiftLint のプロジェクトを見るべき。 👇

また SwiftLint を試したサンプルプロジェクトは GitHub にある。👇

SwiftLint とは?

Swift コードのスタイルをチェックするリントツール。

  • Lint(リント)?

    • コーディングルール違反や、冗長な記述など、を検査する
  • ルール違反の項目がある場合

    • ビルド時に警告・エラーなどを発生させることができる。
    • または、リントツールに自動でスタイル修正(コード修正)をさせることも可能。
  • リントツール導入のメリット

    • コードのスタイルを機械的に一定に保てる
    • コードレビューの質向上を計れる(スタイルに関する指摘は有人でする必要がなくなる)

インストール

Homebrew が入っている環境ならば
brew コマンドで install 可能。  

$ brew install swiftlint

ルールファイルを作成する

.swiftlint.yml ファイルにルールを記述する。

記述の仕方とルールは以下を参照する。

以下、.swiftlint.yml の例。

# Lint 対象を指定
included:
    - SwiftLintSample/
# Lint 対象から除外する
excluded:
    - SwiftLintSample/T.swift
# 無効にするルール
disabled_rules:
    - file_length
    - trailing_comma
    - trailing_whitespace
    - trailing_newline
    - vertical_whitespace
    - function_body_length
    - type_body_length
    - line_length
    - vertical_parameter_alignment
# 変数などの名前の最低の長さを指定。これより短いと違反となる
# 1 にしておくと、このルールが実質無効となる
identifier_name:
    min_length: 1
# 型名のルールに対しての excluded(除外)
# ここでは lowerCamelClass という型名はルールの検査から除外される
type_name:
    excluded:
      - lowerCamelClass

Xcode プロジェクトへの導入方法

f:id:daisuke-t-jp:20190813121202p:plain

XcodeBuild Phases に新たな Run Script を追加する。

そして以下のスクリプトを埋め込む。

if which swiftlint >/dev/null; then
swiftlint --config .swiftlint.yml 
else
echo "warning: SwiftLint not installed."
fi

上のスクリプトを説明すると・・・

  • if which で SwiftLint がインストールされているかをチェックする
    • インストールされていない場合、 echo で警告を表示している
  • swiftlint コマンドの --config 引数で ルールファイル (.swiftlint.yml) のパスを指定できる。
    • 指定しなければ、カレントディレクトリにある .swiftlint.yml を参照する

これでビルドするたびに、 SwiftLint によるチェックが実行される。
もし SwiftLint に引っかかると、通常の警告・エラーと同じく Xcode 上に結果が表示される。

リントの運用

.swiftlint.yml で全体のルールを指定できるが、局所的にルールを決めたいときもある。

その場合は、以下の enable/disable で挟むことで、その部分だけルールの無効・有効を切り替えすることができる。

// swiftlint:enable ルール名
// swiftlint:disable ルール名

たとえば、 func のパラメーター数は SwiftLint ではデフォルトで 5個までとされているが、それを超えたパラメーター数をもつ func を居所的に許可したい場合は以下になる。

  // swiftlint:disable function_parameter_count
  static private func tooManyParameterFunc(a: Int,
                                       b: Int,
                                       c: Int,
                                       d: Int,
                                       e: Int,
                                       f: Int,
                                       g: Int) -> Int {
    return a + b + c + d + e + f + g
  }
  // swiftlint:enable function_parameter_count

おわり