Allow trailing commas in parameter lists and tuples
01 何が問題だったのか
Swift では、配列リテラルや辞書リテラルの末尾要素の後にコンマ(trailing comma)を書くことが許されています。これにより、要素を追加・削除・並べ替えたり、一部の要素だけコメントアウトしたりするときに、隣接する行に余計な差分を生まずに編集できます。
let strings = [
"abc",
"cde",
"fgh",
// "ijk",
]
ところが同じ利便性が、関数の仮引数リストや呼び出しの実引数リスト、タプルの型や値の要素には与えられていませんでした。複数行にわたるパラメータ宣言で最後の引数をコメントアウトしたいだけでも、直前の行のコンマを外す編集が必要になり、差分がその行にも及んでしまいます。
func padStringToLength(
sourceString: String,
destinationCount: Int,
paddingStyle: StringPaddingStyle = .Left,
paddingCharacter: Character = " ", // ← 最後の引数を外したい場合、この行のコンマも編集が必要
) -> String {
/* ... */
}
タプルでも同じで、要素を入れ替えたり末尾要素を外したりするたびにコンマ位置の調整が入り、編集と差分の見通しが悪くなります。
let tuple: (
string: String,
number: Int,
) = (
string: "string",
number: 0,
)
要するに、「コレクションリテラルでは許されている trailing comma が、パラメータやタプルでは許されていない」という非対称があり、複数行で書かれた引数リストの編集作業で余計な手間と差分を生む、というのがこの提案の問題意識でした。
02 どのように解決されるのか
この提案は Rejected(却下) となりました。SE-0084 そのものは Swift 3 には取り込まれず、当時の Swift では引き続き、関数の引数リストやタプルで trailing comma を書くとコンパイルエラーになっていました。
ただし、trailing comma を広く許したいという動機自体は後に引き継がれ、後続の SE-0439(Swift 6.1 で実装)によって、タプル・関数の仮引数/実引数リストをはじめ、対称的に区切られたコンマ区切りリスト全般で trailing comma が許容されるようになっています。SE-0084 は、その出発点となった提案として押さえておくと位置づけが理解しやすくなります。
提案されていた内容(採用されなかったもの)
SE-0084 が提案していたのは、コレクションリテラルでの挙動と揃える形で、関数呼び出し・関数宣言・タプル型定義・タプルリテラル の末尾に trailing comma を許す、というシンプルな仕様でした。コンパイラは末尾のコンマを単に無視する、という扱いです。
もし採択されていれば、次のような書き方がそのままコンパイルできていました。
func padStringToLength(
sourceString: String,
destinationCount: Int,
paddingStyle: StringPaddingStyle = .Left,
paddingCharacter: Character = " ",
) -> String {
/* ... */
}
padStringToLength(
sourceString: "source",
destinationCount: 4,
paddingStyle: .Right,
paddingCharacter: "",
)
要素数が 0 の空タプル・空パラメータリストについては trailing comma を許さない、単一要素のタプルについても(「名前付きの 1 要素タプルは作れない」という既存の制約と揃える意図で)trailing comma は許さない、一方で単一要素のパラメータリストは許す、という扱いでした。既存コードへの影響は無く、従来コンパイルエラーだった書き方が受け入れられるようになるだけ、という後方互換に優しい変更です。
却下の経緯
この提案は Swift 3 のレビュー期間中、コア設計方針(中心的な構文の扱い)とタイミングの面で Swift 3 のスコープから外れ、先送り(defer)扱いとなった上で、後に先送り案件をまとめて整理する流れで最終的に Rejected となりました。
現在の Swift での扱い
その後、コミュニティや標準ライブラリ、swift-format や Xcode などで「閉じ括弧だけを最終行に置く」多行レイアウトが広く定着したこと、parameter pack の導入やマクロ・プラグインなどコード生成の用途が増えたことを背景に、SE-0439 が 2024 年に採択され Swift 6.1 で実装されました。結果として、タプル・関数の仮引数/実引数リスト・イニシャライザ呼び出し・enum の associated value・式マクロや属性の引数リスト・サブスクリプト・ジェネリック引数リスト・文字列補間・if / guard / while / switch などの条件節(for-in の where 句や switch case 条件を含む)・キャプチャリスト・継承句・ジェネリック where 句など、対称的に区切られたコンマ区切りリストの大半で trailing comma が使えるようになっています。
つまり、SE-0084 が目指した「コレクションリテラル以外でも trailing comma を受け入れる」という方向性自体は、最終的に(より広いスコープで)Swift に取り込まれました。SE-0084 自体は却下された提案ですが、現在の Swift の書き味を決める議論の起点としての意味を持っています。