Swift Code Style Guidelines and Formatter
01 何が問題だったのか
Swift には、言語そのものに紐づいた公式のコードスタイルガイドや、それに従ってコードを整形する標準ツールがありませんでした。その結果、Apple 自身が公開している Swift プロジェクト(標準ライブラリ、Foundation、Swift NIO など)でさえスタイルがそれぞれに異なっており、しかも各プロジェクト内でも完全に一貫しているわけではないという状態になっていました。
このためユーザーは、組織ごと・プロジェクトごとにスタイルガイドを整備したり、他プロジェクトから借用したりして対応することになります。しかし、言語側で維持されるスタイルガイドとそれを適用するツールがあれば、次のような価値が得られます。
- 言語のベストプラクティスやパターンを、既存コードから読み取らせるのではなく、明示的に参照できる資料として示せる
- 開発者がコードベースを移動するたびに新しいスタイルを覚え直したり、エディタ設定をやり直したりしなくて済む
- スタイルに悩む時間を減らし、プログラムのロジックに集中できる
- レビューでもスタイル指摘が減り、ロジックや設計の議論に時間を割ける
最初の 2 点は、Swift を学びやすい言語にするというチームの方針とも合致しており、新しいオープンソースプロジェクトや Swift 本体への貢献のハードルを下げることにもつながります。こうした背景から、Swift プロジェクトとして公式のスタイルガイドとフォーマッタを持つべきではないか、という問いに答える必要がありました。
02 どのように解決されるのか
このProposalは具体的なスタイル規則を定めるのではなく、Swift 言語として公式のコードスタイルガイドとフォーマッタを採用するかどうか という存在論的な問いに答えるためのメタProposalとして位置づけられています。方針としては次の 2 点をセットで提案しています。
- Swift として一連のコードスタイルガイドラインを採用する
- そのガイドラインに沿ってコードを整形できるフォーマッタを、Swift プロジェクトの公式ツールとして採用する
スタイルガイドの扱い
具体的なスタイル規則はこのProposalでは定めず、本提案が受け入れられた後に別途Proposalとして議論・批准することが想定されています。議論を発散させないよう、ガイドラインはテーマごとに段階的に提案していく方針で、typographical concerns(字面上の取り決め)、code consistency(コードの一貫性)、best practices(ベストプラクティス)といったテーマが例として挙げられています。
重要なのは、このスタイルガイドを 強制しない という点です。Swift コンパイラは、スタイルに反するだけの構文上妥当なコードを拒否するような変更を加えません。ガイドラインに従いたくないユーザーは、従わなくてもよいという位置づけです。
フォーマッタの扱い
公式フォーマッタとしては、当時 https://github.com/google/swift/tree/format でホストされていた swift-format を Swift プロジェクトに取り込むことが提案されています。他のフォーマッタを排除するものではなく、あくまで「公式にメンテナンスされる 1 つ」として位置づけるものです。swift-format が選ばれた理由としては、次の点が挙げられています。
- 構文指向で実装されており、SourceKit ベースの方式と比べて信頼性・性能の面で有利であること
- Swift プロジェクトが推奨する SwiftSyntax を使ってコードを処理しており、言語の進化に独自の構文解析器で追随する必要がないこと
- 継続的にメンテナンスを行う担い手がいること
このツールは、後続のスタイルガイドProposalにおいて選択肢を検討するための土台としても使われる想定です。
設定可能性
swift-format は、インデント幅、行長、既存の改行をどこまで尊重するか、といった実務的な項目を設定できる形で提供されます。複数言語が混在するプロジェクトでは、ツールによって言語ごとの設定が難しい場合もあるため、ある程度の設定可能性は現実的に必要という立場です。さらに、デフォルト設定に満足できない利用者にもメリットを届けるため、追加の設定項目を受け入れることも検討するとされています。
スタイルガイドと同様に、フォーマッタも Swift ツールチェーンの一部として強制されるわけではなく、使いたくないユーザーは単に実行しないという選択がとれます。
審議の結果
このProposalはレビューの結果 Returned for revision となっており、この形のままでは採択されていません(公式のフォーマッタとしての swift-format の位置づけや、後続のスタイルガイドProposalも、このProposal単体では確定していません)。ただし、ここで議論された動機や設計方針は、その後の Swift における swift-format の取り扱いや、スタイルに関する議論の出発点として参照できるものになっています。