SwiftFormatのプラグインの導入方法（Xcode project 編）

SwiftFormat に、Swift Package Manager ビルドツールプラグインの機能が追加されました。この SwiftFormat プラグインの導入方法についてREADMEに沿って説明します。
おそらく 2022/11/24 にリリースされた SwiftFormat 0.50.4 で対応されたのではないかと思います。

SwiftFormat 0.50.4 リリースノート

https://github.com/nicklockwood/SwiftFormat/releases/tag/0.50.4

> Added Swift package command plugin

関連PR

https://github.com/nicklockwood/SwiftFormat/pull/1297

README.md

https://github.com/nicklockwood/SwiftFormat/blob/master/README.md

:::note info
インフォメーション
記事執筆現在、既に 0.50.7 がリリースされています。
導入される方は最新のリリースを導入すると良いと思います :ok_woman: 
:::

# SwiftFormat のプラグインとは

この機能により、SwiftFormat を SwiftPM コマンド プラグインとして使用できます。

なお、そもそもプラグインとは何かを知りたい方は、以下の記事を読まれることをおすすめします :pray: :sparkles: 

https://qiita.com/usamik26/items/1c2cec0903fea2e03344

# 開発環境

- Xcode 14.0 以降
- Swift 5.6 以降

# SwiftFormat のプラグインの導入方法

SwiftFormat のプラグインの導入方法は、２種類あります。

- Xcode project
    - Xcode project の "Package Dependencies" から SwiftFormat を追加する方法
- Package.swift
    - Package.swift に記述する方法

詳しくは [README.md](https://github.com/nicklockwood/SwiftFormat#swift-package-manager-plugin) に記述されているので、ご参照ください。
当記事では、Xcode project で導入する方法をスクショと共に説明します。

## Xcode project 編

１. プロジェクト設定の "Package Dependencies" タブを開き、"+"　ボタンをクリックします。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/f0b45b06-b258-4175-8afa-4fbd543c2d79.png)

２. 右上の検索バーに `github.com/nicklockwood/SwiftFormat` を入力し、SwiftFormat を検索します。
"Dependency Rule" を適宜変更してください（画像の場合は、 `Up to Next Minor Version` で、0.50.4 以上を指定しています）。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/13bf1cbd-f09a-64bd-bdd1-035ba3dff6d5.png)

３. "Package Product" で選択候補が3つ出ますが、 `SwiftFormat (Library)` のみチェックを入れます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/ed6bb1b5-c559-76ac-1787-dce685ab582a.png)

４. パッケージ追加後の様子

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/2b3069c6-4375-a677-68a4-d41c76003395.png)


# Xcode プロジェクトからのプラグインの実行方法

１. プロジェクト上で右クリックし、 `SwiftFormatPlugin` をクリックします。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/aa000447-1597-2392-33cb-7e5a59aa165b.png)

２. `Run` をクリックします。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/c62d5d6f-32e7-d014-8f2e-aa3d59d4d717.png)

## 例

実行前

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/c853cca6-7efd-b94b-f306-67f7ac0cd72a.png)

実行後

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/d07ef46d-5237-e96e-efb3-de02c89cf9a8.png)

:::note info
インフォメーション
SwiftFormat のルールを記述する `.swiftformat` ファイルを作成しない場合は、SwiftFormat のデフォルトのルールが適用されます。
:::

:::note warn
検討事項
Xcodeからプラグインを実行する場合の実行タイミングは、毎回のコミット前にするのがいいかな？と思います。
チーム開発をする場合は、コマンドラインからのプラグインの実行を、ビルド時などどこかのタイミングに仕込んで自動化した方がいいのかな？ :thinking: と思います。
https://github.com/nicklockwood/SwiftFormat#trigger-plugin-from-command-line

:::

# SwiftFormat のルールに関する設定

SwiftFormat のルールをカスタマイズしたい場合、従来どおり `.swiftformat` ファイルを作成します。

- 例

```:.swiftformat
# format options
--allman true
--indent tab # tabs FTW!

# file options
--exclude Pods

# rules
--disable elseOnSameLine,semicolons
```

従来どおり、新しいバージョンのSwiftFormatのルールを適用させるため、Swift のバージョンを指定する `.swift-version` ファイルを作成します。

- 例

```:.swift-version
5.6
```

## `.swiftformat` ファイルと`.swift-version` ファイルの置き場所

- `.swiftformat` ファイル

> The plugin will find an existing `.swiftformat` in your package root folder and honor it automatically.
> （このプラグインは、あなたのパッケージのルートフォルダにある既存の `.swiftformat` を見つけ、自動的にそれを尊重します。）

- `.swift-version` ファイル

> The preferred option is to add a `.swift-version` file to your project directory. This is a text file that should contain the minimum Swift version supported by your project, and is a standard already used by other tools.
> （望ましい選択肢は、プロジェクトのディレクトリに `.swift-version` ファイルを追加することです。これは、あなたのプロジェクトがサポートする最小のSwiftバージョンを含むべきテキストファイルで、すでに他のツールで使用されている標準的なものです。）

- ルートディレクトリの状態

![root-directory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292215/c33a63c4-3228-15aa-6ef7-9bc84eb787fb.png)

# 最後に

以上、 `SwiftFormat` のプラグインの導入方法の説明でした。
ご覧いただきありがとうございます。

# 参考リンク

https://github.com/nicklockwood/SwiftFormat