swiftlintという静的解析ツールを使って静的解析を行う方法

swift言語の静的解析ツールとして有名なのが、swiftlintと呼ばれるツールです。

静的解析をすることによって、コードの記述でルールがぐちゃぐちゃになるのを防ぎ、正しいキャストになるように指摘してくれたりメリットいっぱいなので導入しているエンジニアの方もたくさんいらっしゃるのではないかと思います。

このswiftlintの導入は比較的楽にできてXcodeでのビルド時に実行することもターミナルでのコマンドラインからも実行することができるので非常に便利なツールです。

その使い方は以下のような感じです。

brewの導入

※ すでにbrewを使っている場合は次のswiftlintのインストールに進んでください。

ターミナルを起動して以下のコマンドを実行します。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

brewより、swiftlintをインストール

引き続きターミナルより以下のコマンドを実行します。インストールでは特にエラーなどはでないと思います。

brew install swiftlint

Xcodeプロジェクトでの設定

プロジェクトごとにXcodeでswiftlintを実行するためのスクリプトを記述していきます。プロジェクトを作るたびにこの設定をしておけば大丈夫ですので、面倒がらずにやっておくとよいでしょう。

  • プロジェクト名→Build Phases 画面に遷移し、「+」ボタンを押下。
  • New Run Script Phasesを選択する

下記にあるコードは、Intel MacでもM1 Macでもどちらでも大丈夫なような記述になっています。 やっていることは、もしswiftlintコマンドが使える場合は、コードの整形をして、静的解析を実行するという内容になっています。

このスクリプトで、インデントの調整や条件式の構文の整形などコードを書いたときの癖も少しだけ修正してくれます。

if type "/opt/homebrew/bin/swiftlint"  > /dev/null 2>&1; then
## format autocorrect
/opt/homebrew/bin/swiftlint --fix --format
## format check
/opt/homebrew/bin/swiftlint
elif type "/usr/local/bin/swiftlint" > /dev/null 2>&1; then
## format autocorrect
/usr/local/bin/swiftlint --fix --format
## format check
/usr/local/bin/swiftlint
else
  echo "swiftlint is not installed."
fi

ターミナルから実行してhtmlに出力する場合

swiftlintによる静的解析の結果をレポートとしてhtmlに出力する場合は、ターミナルから、対象のプロジェクトの場所に行き、以下のコマンドを実行することで、コマンドを実行した場所にswiftlint.htmlというファイルで出力させることが可能です。

cd [プロジェクトの場所]
swiftlint lint --quiet --reporter html > swiftlint.html

解析条件をカスタマイズする

swiftlintを普通に実行すると、デフォルトで設定してあるルールが適用されています。

ルールの確認はターミナルから以下のコマンドを実行

swiftlint rules

もし、解析条件をカスタマイズしたいという場合は、.swiftlint.ymlという隠しファイルを作ることでymlに書かれているルールを基に解析してくれたりします。

cd [プロジェクトの場所]
touch .swiftlint.yml

詳しくは、swiftlintの公式にルールの方法が記載されていますので、参照するとよいかもしれません。 https://github.com/realm/SwiftLint

.swiftlint.ymlの記述例

# Swiftlint Rules

# 無効にするルール
disabled_rules:
  # 一行の文字数が多い
  - line_length
  # 関数の行数が多い
  - function_body_length
  # 関数の複雑度が大きい
  - cyclomatic_complexity
  # ファイルの行数が多い
  - file_length # ファイルの行数が多い
  # クラスの行数が多い
  - type_body_length # 

# 有効にするルール(標準ルールに追加して明示的に有効にする)
opt_in_rules:
  # 不要なbreak文がある
  - unneeded_break_in_switch
  # 強制キャストがある 
  - force_cast
  # +=などを使っていない
  - shorthand_operator
  # ToDoが残っている
  - todo

以上、Xcodeでのプログラミングが少し捗るswiftlintの紹介でした。

MacOS $ sw_vers;xcodebuild -version;swift --version

ProductName:	macOS
ProductVersion:	11.4
BuildVersion:	20F71
Xcode 12.5.1
Build version 12E507
Apple Swift version 5.4.2 (swiftlang-1205.0.28.2 clang-1205.0.19.57)
Target: x86_64-apple-darwin20.5.0

Category