Xcode
iOS
Swift
SwiftLint

SwiftLint でカスタムルールを作成する

小ネタですが、SwiftLint でカスタムルールを作成したときのことを書きます。

背景

SwiftLint は Swift の静的解析ツールでチーム開発をする際にコードフォーマットを揃える手助けをしてくれます。うまく設定すれば、コードレビューの時に、チームのコーディング規約に沿っているかをレビューしなくて済むようになると思うので、私がとても注目しているツールの一つです。

https://github.com/realm/SwiftLint

SwiftLint.png

先日、あるバグを一時回避するために「UITableViewDelegateestimatedHeightForHeaderInSection をこのクラスで実装するのは一時禁止しよう」という話になりました。そこで、SwiftLint のカスタムルールを試してみました。

やり方

基本的には SwiftLint の設定ファイルを編集するだけです。バグの詳細を説明すると、本題から逸れてしまうので「SampleClassestimatedHeightForHeaderInSection の実装禁止」というルールを作成するとします。

.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 を保存してビルドをすると、こんな感じでエラーが表示されます。

SwiftLintCustomRuleResult.png

まとめ

正規表現さえ書ければ、かなり簡単にルールが作成できます。また、ビルド時にルールが適用され、インラインでエラーが表示されるので、ディベロッパーフレンドリーです。

参考文献

Defining Custom Rules
https://github.com/realm/SwiftLint#defining-custom-rules

SwiftLint の導入方法
https://qiita.com/OSR108/items/4b23b13bd23feada1921

カスタムルールの作成方法
https://qiita.com/shobyshoby/items/586de847169093bfe47d