🧹

Xcode に内蔵された swiftlang/swift-format を使う

2024/09/17に公開4

まとめ

コマンドラインツール(CLI)

# `xcodebuild -version` で
# Xcode 16.0
# Build version 16A242d 以降であることを確認してから
swift format --help
xcrun を使う場合
# `xcodebuild -version` で
# Xcode 16.0
# Build version 16A242d 以降であることを確認してから
xcrun --run swift-format --help

# または `--find` を使う
$(xcrun --find swift-format) --help

Xcode のメニュー

Editor > Structure > Format File with 'swift-format' (Ctrl + Shift + I)

swiftlang/swift-format とは

swiftlang/swift-format(旧 apple/swift-format)は、Swift を使ったプロジェクトで用いることのできるコードフォーマッター(Format)およびリンター(Lint)です。

swiftlang 下にあり、公式のフォーマッターであるとも言えます。

これまでの swiftlang/swift-format のインストール方法

swiftlang/swift-format はコマンドラインツールとして使う方法、Swift Package プラグイン(コマンドプラグイン)として使う方法などがありました。コマンドラインツールとして使う方法は例えば以下のとおりです。

Swift Package Manager 経由でコマンドラインツールとしてインストールする
git clone https://github.com/swiftlang/swift-format
cd swift-format
git checkout refs/tags/600.0.0  # Swift 6.0 の場合
swift package experimental-install --product swift-format
Homebrew 経由でコマンドラインツールとしてインストールする
brew install swift-format
Mint 経由でコマンドラインツールとしてインストールする
mint install swift-format

コマンドラインツールとしての swiftlang/swift-format の使い方

ヘルプを表示するには --help を使います。

# パスを通している場合
swift-format --help

# パスを通していない場合(Swift Package Manager の例)
~/.swiftpm/bin/swift-format --help

# パスを通していない場合(Homebrew の例)
/opt/homebrew/bin/swift-format --help

# Mint へのパスを通している場合
mint run swift-format --help

詳しい使い方は --help の内容、swiftlang/swift-format の README、そのほかの解説記事等を参照してください。

🎉 swiftlang/swift-format が Xcode の内蔵ツールチェーンに含まれるように

2024年9月17日(日本時間)に一般向けにリリースされた Xcode 16 より、内蔵ツールチェーンにこの swiftlang/swift-format が同梱されるようになりました。これにより、コマンドラインツールとして使用したい場合に Swift Package ManagerHomebrewMint を経由するなどしてインストールしなくても、Xcode がインストール済みであれば swiftlang/swift-format が使える状態になっています。

お好きな方法(App Store 等)で Xcode 16.0 (16A242d) 以降をインストールした後、xcodebuild にて 16.0 (16A242d) 以降がアクティブになっていることを確認します。

xcodebuild -version
# Xcode 16.0
# Build version 16A242d

xcrun--find を用いることで、内蔵ツールチェーンに含まれている swiftlang/swift-format のパスを出力できます。

xcrun --find swift-format
# /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-format

Xcode の swiftlang/swift-format をコマンドラインツールとして使う

swift format を用いることで、Xcode の内蔵ツールチェーンの swiftlang/swift-format を実行できます。

# `xcodebuild -version` で
# Xcode 16.0
# Build version 16A242d 以降であることを確認してから
swift format --help

xcrun を使う場合

xcrun--run を用いることで、Xcode の内蔵ツールチェーンの swiftlang/swift-format を実行できます。

# `xcodebuild -version` で
# Xcode 16.0
# Build version 16A242d 以降であることを確認してから
xcrun --run swift-format --help

# または `--find` を使う
$(xcrun --find swift-format) --help

これまで swift-format を実行していたスクリプト等では、それを swift format 等に置き換えることで、Xcode の内蔵ツールチェーンの swiftlang/swift-format を使うように変更できます。

Xcode のメニューから swiftlang/swift-format を使う

Xcode のエディタでファイルを編集している間に、swiftlang/swift-format を使ったフォーマッティングを行うには、「Editor」>「Structure」>「Format File with 'swift-format'」を都度クリックします。もしくは、Ctrl + Shift + I でも都度実行できます。


Editor > Structure > Format File with 'swift-format' (Ctrl + Shift + I)

Discussion

monomono

xcrun の --run を用いることで、Xcode の内蔵ツールチェーンの swiftlang/swift-format を実行できます。

swift formatで済ませるのが短くて良いと思います。

You can run swift-format from anywhere on the system using swift format
https://github.com/swiftlang/swift-format

treastrain / Tanaka Ryogatreastrain / Tanaka Ryoga

ご指摘ありがとうございます!

初稿での xcrun を使う方法についてはアコーディオンに閉じ、swift format を使う方法へと更新させていただきました。

Muukii - Kimura HiroshiMuukii - Kimura Hiroshi

.swiftformatでしたっけ、そういう設定ファイルを読んでくれるのか気になってました。
調べてみよう

Muukii - Kimura HiroshiMuukii - Kimura Hiroshi

読んでくれましたわ
.swift-format

例えばこんな設定で

{
  "maximumBlankLines" : 1,
  "indentConditionalCompilationBlocks" : false,
  "lineLength" : 100,
  "rules" : {
    "DoNotUseSemicolons" : false
  },
  "lineBreakBeforeEachGenericRequirement" : true,
  "lineBreakBeforeEachArgument" : true,
  "indentation" : {
    "spaces" : 2
  }
}