今年度の 6 月頃から iOS アプリの開発をしております @hofzzy と申します。
業務で SwiftLint を導入したのでその知見を共有します。
Installation
複数人開発において SwiftLint のバージョンを揃えたかったので、CocoaPods を使用してインストールしました。
Homebrew でインストールすることも可能ですが、筆者はその方法を試していないので、今回その説明は割愛させていただきます。
Podfile に SwiftLint を追加する
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
これでビルド時に Lint が適用され、警告やエラーがあれば Xcode の Issue Navigator に表示されるようになります。
Configuration
デフォルトのルールのまま運用していくには色々不都合があったため、Lint の設定をカスタマイズしています。
ます SwiftLint を導入したプロジェクトのルート直下に .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 autocorrect
と swiftlint
の両方を実行する必要があります。