🍩

iOS開発初心者、SwiftLintとSwiftFormatを導入する

2021/01/15に公開

概要

初めまして。Web Developer1年目ですが現在業務でSwift UIを使った小規模iOSアプリを1人で新規開発しています。これが初めてのiOS開発です。

ある程度アプリが仕様通りに動く様になってきて余裕が出てきたので、少しずつ環境やソースコードを整えるべく、まずは第一弾としてSwiftLintSwiftFormatを導入しました。

SwiftLintの導入

今回はHomebrewでインストールします。
本来であればMintSwiftPMを使ってプロジェクト毎に依存関係として明示して管理すべきですが...

brew install swiftlint

GitHub: realm/SwiftLint: A tool to enforce Swift style and conventions.

SwiftFormatの導入

SwiftLintと同様に、Homebrewでインストールします。

brew install swiftformat

GitHub: nicklockwood/SwiftFormat: A command-line tool and Xcode Extension for formatting Swift code

gitのpre-commitに設定する

Gitのローカルリポジトリ直下に.git/hooks/pre-commitと言うファイルを作成します。

.git/hooks/pre-commitの内容はこちらを参考にしました。
私はzshユーザーなので1行目のシェバンは#!/bin/bashではなく#!/bin/zshになっています。

#!/bin/zsh

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

git diff --diff-filter=d --staged --name-only | grep -e '\(.*\).swift$' | while read line; do
  swiftformat "${line}";
  git add "$line";
done

XcodeのBuild Phasesに設定する

Build PhasesにはSwiftLintだけ走らせる様にスクリプトを書きます。

SwiftFormatのREADME.mdにはこの様な記述がありました。

このスクリプトを追加すると、作業中にソースファイルが上書きされ、元に戻す履歴がクリアされるという厄介な副作用が発生します。スクリプトをメインターゲットではなくテストターゲットに追加して、アプリをビルドするたびではなく、単体テストを実行するときにのみスクリプトが呼び出されるようにすることをお勧めします。

またこの様なIssueも立っており、一度SwiftFormatを走らせると、ソースファイルに対してUndo操作ができなくなる様です。

Losing file history and can't "undo" and changes · Issue #264 · nicklockwood/SwiftFormat

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

Discussion