はじめに
こんにちは。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のデフォルトルールだけではカバーできないようなコーディング規約も自動でチェックすることが可能になります。
参考文献
- SwiftLintFramework Reference
- Defining Custom Rules
- SwiftLintのカスタムルールを使って、スクリーン計測用コードの実装漏れを防ぐ
- 【開発効率向上】SwiftLintを導入した話
この記事を書いた人
最近書いた記事
- 2023.03.30【Swift】iOS 16で画面回転禁止処理を行っている箇所で無限ループが発生しクラッシュする
- 2023.03.27SwiftLintでカスタムルールを追加してみた
- 2022.09.30【Swift】CoreDataのユニットテストの環境構築
- 2022.09.30【Swift】CoreDataの概念を知る