Swift 5.2では関数・メソッドの最後の引数がデフォルト引数の場合、その1つ前のクロージャの引数をtrailing closureとして呼べるようになった
タイトルがほぼ全てです。
func foo(_ closure: () -> Void, defaultArg: Int = 0) { closure() } foo { print("foo") }
このコードはSwift 5.2では動作しますが、Swift 5.1以前ではコンパイルエラーになります。
Nimbleに挙がったissueでそのことに気付きました。
Discordのswift-developers-japanで話してみたところ、apple/swiftのこのコミットが該当の変更であることを分かりました。
さらに芋づるで分かったことがあって、一時期のSwiftのDevelopment SnapshotでNimbleのビルドが通らなくなったり、そのリグレッションがきっかけでapple/swift-source-compat-suiteにNimbleが追加されたのもこの辺りに関連した変更の影響でした。
- [SR-12291] Regression in overload resolution - Swift
- Doesn't build with the latest Swift Development Snapshot (DEVELOPMENT-SNAPSHOT-2020-02-21-a) · Issue #733 · Quick/Nimble
色々繋がっていて面白いですね、めでたしめでたし。