小ネタですが、SwiftLint でカスタムルールを作成したときのことを書きます。
#背景
SwiftLint は Swift の静的解析ツールでチーム開発をする際にコードフォーマットを揃える手助けをしてくれます。うまく設定すれば、コードレビューの時に、チームのコーディング規約に沿っているかをレビューしなくて済むようになると思うので、私がとても注目しているツールの一つです。
先日、あるバグを一時回避するために「UITableViewDelegate
の estimatedHeightForHeaderInSection
をこのクラスで実装するのは一時禁止しよう」という話になりました。そこで、SwiftLint のカスタムルールを試してみました。
#やり方
基本的には SwiftLint の設定ファイルを編集するだけです。バグの詳細を説明すると、本題から逸れてしまうので「SampleClass
の estimatedHeightForHeaderInSection
の実装禁止」というルールを作成するとします。
##.swiftlint.yml
プロジェクトルートにある .swiftlint.yml を編集します。
# Custom rules
custom_rules:
sampleclass_estimatedheightforheaderinsection_bug:
included: "SampleClass.swift"
name: "SampleClass estimatedHeightForHeaderInSection"
regex: "(estimatedHeightForHeaderInSection)"
match_kinds:
- identifier
message: "SampleClass で estimatedHeightForHeaderInSection を実装しないで下さい"
severity: error
では、各行の説明をしていきます。
# Custom rules
custom_rules:
カスタムルールのセクションがここからスタートします。この後に複数ルールを設定することが可能です。
ちなみに'#'はコメント行です。
sampleclass_estimatedheightforheaderinsection_bug:
ルールの ID です。できるだけ分かりやすい名前をつけておきます。
included: "SampleClass.swift"
ルールを適用するファイルを指定したい場合はこのように指定します。
name: "SampleClass estimatedHeightForHeaderInSection"
ルールに違反した時に出るメッセージのタイトルになります。Xcode 上では "XXX Violation" と表示されるので、ユーザー(ディベロッパー)が分かりやすいタイトルをつけます。
regex: "(estimatedHeightForHeaderInSection)"
ルール本体の正規表現です。正規表現の得意な人なら、様々なルールが作成できると思います。
match_kinds:
- identifier
ルールを適用する対象を設定できます。何も指定しないと、コード全体でコメントも含まれてしまうので、このように identifier で絞っています。その他、どのようなものが指定できるかは公式ドキュメントを参照するのが良いと思います。
message: "SampleClass で estimatedHeightForHeaderInSection を実装しないで下さい"
ルールに違反した時に出るメッセージの詳細部分です。Xcode 上に表示されるので、他の人にもよく分かるように詳細を書きます。修正の方法まで含めることができれば、完璧でしょう。
severity: error
error
にすると、ルールに違反した時にビルドエラーになります。warning
にすると、やはり表現が弱いので、他の warning などもあれば、無視されて埋もれてしまう可能性もあります。これは、というルールはビシッと error
にしてしまった方が良いと思います。
##エラー表示
.swiftlint.yml を保存してビルドをすると、こんな感じでエラーが表示されます。
#まとめ
正規表現さえ書ければ、かなり簡単にルールが作成できます。また、ビルド時にルールが適用され、インラインでエラーが表示されるので、ディベロッパーフレンドリーです。
#参考文献
Defining Custom Rules
https://github.com/realm/SwiftLint#defining-custom-rules
SwiftLint の導入方法
https://qiita.com/OSR108/items/4b23b13bd23feada1921
カスタムルールの作成方法
https://qiita.com/shobyshoby/items/586de847169093bfe47d