質問: が必要 Color(.clear) } ) ``` なんとなく返り値を明示するとFunction Builderではなくなって、 普通のクロージャになっている気がするのですが、どういう原理なんでしょうか?
回答: `ViewBuilder`は、Appleの独自実装の扱いだった`_functionBuilder`から、Swift 5.4以降は名称の変更された`resultBuilder`として実装されています。 SE-0289 Result builders その中にこんな記載があります。 > > ### Imperative control-flow statements > > > `return` statements are ill-formed when they appear within a transformed function. However, note that the transformation is suppressed in closures that contain a `return` statement, so this rule is only applicable in `func`s and getters that explicitly provide the attribute. > > > *note that the transformation is suppressed in closures that contain a `return` statement* とありますので、「返り値を明示する」ことではなく、「`return`文を含むクロージャである」ことが本質的なようです。 (Swiftのクロージャでは、ほんの少し複雑なクロージャでは返り値を明示することが求められるので、「返り値を明示する」のは「`return`文を含むクロージャ」がエラーを起こさないようにするために必要、と言うことになります。エラーになった場合には、「ViewBuilderの中では明示的にreturn文を書いちゃダメ」の意味のエラーが表示されたりしますが、それはまた別の話。) 返り値の明示も`print`も消すと、`return`ありでもエラーにはならないので、resultBuilderとしての変形は行われていないのだろうと思われます。 実際にはどんなクロージャの書き方ならOK、どんな書き方ならダメと言う詳細が明確化されているわけではないので、Swiftコンパイラのバージョンによっては、挙動が変化する可能性はあるかと思います。