iOS
Swift
SwiftLint

SwiftLint の導入

今年度の 6 月頃から iOS アプリの開発をしております @hofzzy と申します。
業務で SwiftLint を導入したのでその知見を共有します。

Installation

複数人開発において SwiftLint のバージョンを揃えたかったので、CocoaPods を使用してインストールしました。
Homebrew でインストールすることも可能ですが、筆者はその方法を試していないので、今回その説明は割愛させていただきます。

Podfile に SwiftLint を追加する

Podfile
platform :ios, '10.0'

target 'sample1' do
  use_frameworks!

  pod 'SwiftLint', '0.23.0'
end

Podfile に SwiftLint を追加したらターミナルで pod install を実行しましょう。以上でインストールは完了です。

Xcode

Xcode でビルドをした際に自動で Lint が走るようにします。

Xcode でプロジェクトファイルを選択し、Build Phase の Run Script に以下のスクリプトを貼りつけましょう。

if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then
    ${PODS_ROOT}/SwiftLint/swiftlint
else
    echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

rub_script.png

これでビルド時に Lint が適用され、警告やエラーがあれば Xcode の Issue Navigator に表示されるようになります。

Configuration

デフォルトのルールのまま運用していくには色々不都合があったため、Lint の設定をカスタマイズしています。
ます SwiftLint を導入したプロジェクトのルート直下に .swiftlint.yml を作成します。筆者は以下のような内容で作成しました。

.swiftlint.yml
included:
  - MyApp/
excluded:
  - Pods/
opt_in_rules:
  - closure_spacing
  - conditional_returns_on_newline
  - empty_count
  - operator_usage_whitespace
disabled_rules:
  - force_cast
  - force_try
line_length: 300
identifier_name:
  min_length:
    warning: 1

included

ここには Lint の対象とするディレクトリ (ファイル) のパスを記述します。

excluded

ここには Lint の対象から除外するディレクトリ (ファイル) のパスを記述します。筆者は CocoaPods でインストールしたライブラリを Lint の対象から除外するようにしています。

opt_in_rules

デフォルトでは除外されているルールを追加したい場合はここに記述します。
ルールの一覧は SwiftLint の GitHub に記載されています。(https://github.com/realm/SwiftLint/blob/master/Rules.md)

disabled_rules

デフォルトで適用されているルールで無効にしたいものがある場合はここに記述します。
なるべくここには何も書かない方が望ましいのかもしれませんが、筆者は場合によって force cast や force try は使用するので、この二つを警告するルールは無効化しています。

既存ルールの警告レベルの調整

警告レベルを調整したいルール名の後に数値を指定することで設定できます。

  • line_length

line length による警告レベルを調整します。
筆者は Macbook Pro 13-inch のディスプレイで作業することが多いため、導入当初は 140 くらいで運用していたのですが、UIKit のコンポーネントに実装されている delegate メソッドなどはそれを軽々と越えてくるため、いまは 300 くらいで運用しています。

  • identifier_name

変数の文字数に関する警告レベルを調整します。
デフォルトだと min_length: warning: 2 が設定されているので、文字数が 2 文字の変数には警告が出ます。

Auto correct

SwiftLint は autocorrect オプションをつけて実行することで、軽微なエラーを自動で修正してくれます。
Auto correct を実行したい場合は、Run Script のスクリプトを以下のように書きかえます。

if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then
    ${PODS_ROOT}/SwiftLint/swiftlint autocorrect
    ${PODS_ROOT}/SwiftLint/swiftlint
else
    echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

autocorrect オプションをつけた場合、標準の Lint は実行してくれないため swiftlint autocorrectswiftlint の両方を実行する必要があります。