PHONE APPLI Engineer blog

エンジニアブログ

【開発効率向上】SwiftLintを導入した話

こんにちは、PHONE APPLIのスマホチーム所属、チームリーダー担当の高橋 篤史(たかはし あつし)です。

今回で記事書くのは3回目です。

過去2回は技術というよりかはチーム活動の紹介しかしていなかったことを反省し、今回は技術的な記事を書くことにチャレンジしたいと思います!

この記事のターゲット

  • iOS開発初心者
  • コードの共通ルールがほしいと思っている管理者やチームリーダー

SwiftLintとは

SwiftLint は GitHub の Swift Style Guide に基づいて、 Swift のスタイルと規則を自動でチェック・ルールによって自動でコードを修正するツールです。

メンテナンスはRealm Inc.が行っているOSS(Open Source Software)です。Star(いいねのようなもの)の数が2021年2月時点で14000を超えており、多くのSwift言語を使用するエンジニアから支持されていることがわかります。

導入背景

一定の秩序の必要性

「自分はこう書きたいんだ!」「この方が綺麗だし、いいコードだと思うんだ!」 ということは、プログラマとしてよくある話だと思います(実際自分でも思うところはあります(笑))し、よりいいものを追求していくことは素晴らしいことだと考えています。

ただ、こういった話はその人の主観だったり解釈になりやすく、衝突の原因になりやすいという点がデメリットとして挙げられるとも考えています。

スマホチームは2020年4月時点では8名でしたが、2021年2月現在では16名と、1年足らずでメンバーが倍になっています。 人数が少ない間は誰が何をしているかも各々ですぐに把握可能でしたし、ちょっと集まって会話をすれば多少の衝突はすぐに解決できていました。

しかし、人数が増えていくにつれ、一定の秩序を元に開発を行わないと余計な衝突に時間をかけてしまい、本来進めるべきユーザーに価値を届ける開発に集中できなくなるのではないか、という思いを抱きました。

そのため、公式のSwiftドキュメントにまとめられているようなルールに関しては自動でチェックし、より本質的なことに集中するためにSwiftLintの導入をしました。

導入方法

※記事執筆時点での開発環境の最新バージョンは以下です。

  • Xcode 12.4
  • Swift 5.3.2
  • SwiftLint 0.42.0

おおまかな流れとしては

  1. SwiftLintのインストール
  2. スクリプトを記載する
  3. (お好みで)ルールを調整する

です、一つずつ解説します。

1. SwiftLintのインストール

HomebrewCocoaPodsでインストールが可能です。

Mintを使用する方法もあるのですが、今回は割愛します。

Homebrewの場合

ターミナルやiTermなどのコマンドラインツールで以下のコマンドを実行します。

brew install swiftlint

Homebrewでインストールする場合のメリット・デメリット

  • メリット

    • CocoaPodsなどのライブラリ管理ツールを導入・学習する必要がなく、気軽に試すことが可能。個人開発やお試し導入に向いている。
  • デメリット

    • 複数人開発の際に、開発者間でSwiftLintのバージョンで差分が発生してしまう可能性がある。
    • 複数人開発の際に、開発者が各々でSwiftLintをインストールする必要がある。
CocoaPodsの場合

Podfileに以下を記載してpod installを行います。

pod 'SwiftLint'

CocoaPodsでインストールする場合のメリット・デメリット

  • メリット

    • 複数人開発の際に、開発者間でSwiftLintのバージョンを統一可能。
    • 複数人開発の際に、開発者が各々でSwiftLintをインストールする必要がない。
  • デメリット

    • ライブラリ管理ツールの導入・学習コスト。気軽に試すことが難しい。

2. スクリプトを記載する

Xcodeプロジェクトを開き、Build Phases > New Run Script PhasesRun Scriptを新規作成します。

f:id:pa-atsushi-takahashi:20210224105009p:plain

作成したRun Scriptに以下のスクリプトを記載します。

スクリプトを記載した後にビルドをすると、SwiftLintで設定されたルールに反した実装箇所に、警告やエラーが表示されるようになります。

Homebrewの場合

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

CocoaPodsの場合

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

3. (お好みで)ルールを調整する

2.まででSwiftLintでデフォルト設定されているルールはチェックできるのですが .swiftlint.ymlというファイルを新規作成することで、ルールをカスタマイズすることができます。

細かいルールについては今回は紹介しませんが、ymlファイルを記載する際に覚えておいた方がいい用語を紹介します。

  • disabled_rules: デフォルトの設定から適応しないルールを記載します
  • opt_in_rules: デフォルト以外で追加したいルールを記載します
  • custom_rules: (一定のルールを元に)カスタムされたルールを追加できます
  • excluded: SwiftLintでチェックしないファイルやディレクトリを記載します

細かいルールの内容は以下が公式ドキュメントです、興味あれば覗いてみてください。 realm.github.io

Auto Correctについて

一部のルールでは、スクリプトswiftlint autocorrectを記載すると、ビルドした際に自動的にルールに従ってコードが修正されます。

Homebrewの場合

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

CocoaPodsの場合

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

「自動で修正してくれるって便利!」という考えもあるのですが、裏を返すと意図しない変更が勝手にされてしまう、というデメリットがあると考えています。

そのため、スマホチームではAuto Correctは基本的には使用していません。 (定期的にコードフォーマットがルール通りかを確認することがあり、その際に一時的に使用することはあります。)

今後の展望

現状、SwiftLintの警告が出ているかが実際に自分の手元でビルドしてみないとわからないため、まだ不便な点があります。

Pull Request時に修正したファイルのみにSwiftLintのチェックをかけ、Pull Requestに自動で警告コメントをする仕組みを作る予定です。

引き続き開発効率の向上に取り組んでいきます!

最後まで読んでいただき、ありがとうございました!

参考 : SwiftLint公式 GitHub

github.com