[備忘録]CocoaPodsでSwiftLintを導入したった。

## 環境

Swift: 5.9.2
Xcode: 15.1
Swiftlint: 0.53.0


確認方法
```
$ xcodebuild -version  //Xcode
$ swift --version      //swift
$ swiftlint --version  //swiftlint
```


## 参考ページ

https://realm.github.io/SwiftLint/index.html

## pod initでPodfileを作成します。

`$ pod init`
以下のファイルが作成されます。

![podFileの写真.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/860230cc-a6d1-71cd-17ae-03c8d3a1996c.png)

このファイルに以下のような文言を追加します。

![スクリーンショット 2023-12-16 23.08.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/c729ba2a-99bd-dacc-6182-dbf85569c501.png)

## pod installを実行

pod fileに記述した内容を反映させます。

`$ pod install`

Podfile.lockのバージョンに従ってプロジェクトの依存関係をインストールします。以下のような結果になるかと思います。

![スクリーンショット 2023-12-17 15.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/9bd2e7ca-c24f-a69e-350b-f1c29f53b369.png)


もしもプロジェクトを開いている場合は一度閉じて、この白色のファイル(xcworkspaceファイル)を開きます。

![スクリーンショット 2023-12-16 23.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/2d63fd16-5da3-5a6e-d2ff-40da2da21ce4.png)

## Xcode上で設定を行う

以下の画像の手順で設定を行います。

![スクリーンショット 2023-12-16 23.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/c9404ccb-33a4-e055-6026-45b1c7146014.png)

『`New Run Script Phase`』を開いて、以下をスクリプトとして挿入します。

![スクリーンショット 2023-12-16 23.29.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/96c43759-82f8-3c56-2ca9-88958d0f9c82.png)

『`Run script`』が追加されるので、以下の文言をスクリプトに記述します。今回はPodsでインストールするため`{"${PODS_ROOT}/SwiftLint/swiftlint"}`がポイントになってきます。

```
if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then
    ${PODS_ROOT}/SwiftLint/swiftlint
else
echo "warning: SwiftLint not installed, download from 
      https://github.com/realm/SwiftLint"
fi
```

![スクリーンショット 2023-12-17 13.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/54176308-35b0-fd18-79ae-8c7c1fa6eec9.png)


:::note warn
もしも、うまく動かない！となったら、、、
:::

公式の引用です。

> **Xcode15** では、ENABLE_USER_SCRIPT_SANDBOXING ビルド設定のデフォルト値を NO から YES に設定することで大幅な変更が加えられました。 その結果、SwiftLint はファイル権限の欠落に関連するエラーに遭遇します。 これは通常、次のように表示されます: error: Sandbox: swiftlint(19427) deny(1) file-read-data.

『`User Script Sandboxing`』が 『**No**』 になっているか確認します。

![スクリーンショット 2023-12-17 0.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/0d9489c5-209e-7195-a54f-6b135e854867.png)

shunsukeさんの記事を参考にさせていただいました！詳しく知りたい方は是非参考にしてください!

https://qiita.com/shunsuke250/items/5bc1a9613290a2647a11

ここまでできたら、一旦Buildして確認してみます。

![スクリーンショット 2023-12-17 13.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/7a24aa5e-777e-7eb4-6aa7-6c95c3809860.png)

:::note alert
怒られていますね！！
 - 型名違反（アンダースコアを型名で使用している）
 - 無駄な改行
:::
 
 この二つで怒られてしまったので、無事SwiftLintが導入できていることが確認されました！
 
## YAMLファイルを作成し、SwiftLintの細かなルールを設定を行う

このファイルに対して、ルールの設定をしてみます！
今回はSwiftLintのデフォルト設定となっている、型名の指定を無効化させます。完成イメージは以下のような感じです。型名にアンダースコアをつけると怒られていましたが、これを怒られないようにします。

![スクリーンショット 2023-12-17 15.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/ce923ad3-b74d-22b4-9df5-feee8e03d888.png)

まず、『`YAMLファイル`』を作成します！

プロジェクトのカレントディレクトリをYMALファイルを作成したいディレクトリまで移動させます（cdコマンドを使う）移動したら、以下のコマンドを叩き、YAMLファイルを作成します。（プロジェクトファイルのディレクトリに移動してから行なってください。）
```
$ touch .swiftLint.yml
```

すると、以下の半透明のアイコン（隠しファイル）がプロジェクトファイルに追加されます。
<details><summary>隠しファイルの表示・非表示</summary>
com + shif + .
</details>

![スクリーンショット 2023-12-17 14.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/c46c6cfc-e395-164e-266c-96052e25ceaf.png)

この『.swiftLint.yml』にルールを記述し、ルールを変更していきます。追加する内容は以下の通りです。

![スクリーンショット 2023-12-17 15.11.13 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3232025/7e7c2c9b-08bc-2b12-6ba2-e2f26666855a.png)

ルールの特徴２つ

- デフォルト設定として`有効`になっているものを`無効化`させる
- デフォルト設定として`無効`になっているものを`有効化`させる

今回は有効にされていたものを無効化させましたが、逆のパターンもあります。より理解を深めていけるよう、色々試していきたいと思います。

公式ページの以下の部分にルール設定について記載があるので、参考にしてみてください。

https://github.com/realm/SwiftLint?tab=readme-ov-file#rules:~:text=swiftlint%20%2D%2Dfix%20%2D%2Dstrict-,%E3%83%AB%E3%83%BC%E3%83%AB,-SwiftLint%20%E3%81%A8%20Swift