はじめに
こんにちは。iOSアプリ開発Gの深山です。
私が所属するチームでは、SwiftLintを使用して、開発チーム内で取り決めたコーディング規約のチェックを自動化しています。
SwiftLintのデフォルトルールによるチェックで、コーディング規約のうち、大半の項目のチェックを自動化できていましたが、中にはデフォルトルールだけでは違反が検出できない規約もあり、この規約に関しては手作業でのチェックを行うような運用が続いていました。
そこで、今回はSwiftLintのカスタムルールの仕組みを利用することで、デフォルトルールだけではチェックできない規約項目を自動でチェックできるようにしました。
この記事では、SwiftLintのカスタムルールの作成方法とその実例の一部を紹介します。
SwiftLintとは
SwiftLintは、Swiftの静的解析ツールの一つです。ソースコードを解析して、特定のルールに違反していないかチェックしてくれます。
SwiftLintはHomebrewやCocoaPodsで導入できます。また、Xcodeで
Run Scriptの項目を追加し、必要なスクリプトを記述することで、チェック自体を自動化することもできます。
検査対象のルールはデフォルトで数多く用意されています。.swiftLint.yml内の設定でそれらのルールの有効・無効を切り替えることができます。 デフォルトのルールについては、こちらを御覧ください。
詳細な導入方法は、この記事では割愛します。
カスタムルールの作成方法
例として、コーディング規約として定めている「
extensionでコードブロックを区切る際は、MARKコメントをつける。」という項目をチェックするカスタムルールを作成します。
// BAD
extension ViewController: UITableViewDataSource {
...
}
// GOOD
// MARK: UITableViewDataSource
extension ViewController: UITableViewDataSource {
...
}
カスタムルールを追加するには、
.swiftlint.ymlのcustom_rulesセクション配下に以下のように追記します。
こちらが完成版です。
custom_rules:
mark_comment:
include: '.swift'
name: 'MARK Comment'
regex: '^\nextension \w+\: \w+'
message: 'MARKコメントをつけてください。'
severity: warning
各行の説明をしていきます。
mark_comment:
ルールの識別子です。 何についてのルールであるのかが分かるような命名にしました。
include: '.swift'
ルールの適用範囲を指定できます。適用するファイルは正規表現で表します。今回は全.swiftファイルに適用するための表記としました。
他にも、例えば、
included: '\w*ViewController.swift'とすれば、ViewControllerが記述してあるファイルのみにルールを適用することができます。
name: 'MARK Comment'
ルール違反時に表示されるメッセージのタイトルです。Xcodeでは、
MARK Comment Violationと表示されます。
regex: '^\nextension \w+\: \w+'
ルールに違反する箇所を表した正規表現です。この正規表現にマッチする箇所がルール違反とされます。
message: 'MARKコメントをつけてください。'
ルール違反時に表示されるメッセージの詳細です。開発者がこのメッセージを見て、修正方法がわかるような内容にしました。
severity: warning
このルールの重大度です。以下2つのいずれかを指定します。
errorこのルール違反箇所をエラーとして扱います。このルールに違反した箇所がある場合、ビルドエラーによりビルドできません。 )
warningこのルールの違反箇所をwarning(警告)として扱います。そのため。このルールに違反した箇所がある場合でもビルド自体は可能です。
カスタムルール紹介
今回私が追加したカスタムルールを一つ紹介します。
ルール: guardの条件を複数列挙する際は、全て改行する。
これは、ブレイクポイントを貼ることでのデバッグしやすさを優先するためのルールです。
// BAD
guard isLogin, let url = URL(string: "https://www.google.co.jp/") else {
return
}
// GOOD
guard
isLogin,
let url = URL(string: "https://www.google.co.jp/")
else {
return
}
ルールは次のように設定しました。
multiple_enumeration:
included: '.swift'
name: 'Multiple Enumeration'
regex: 'guard [ \S]+,(?![^(]*\))'
message: 'guardの条件文を複数列挙する際は全て改行してください。'
severity: warning
まとめ
このように、SwiftLintのカスタムルールは、正規表現を用いることで作成することができます。 これを活用することで、SwiftLintのデフォルトルールだけではカバーできないようなコーディング規約も自動でチェックすることが可能になります。
参考文献
深山侑花