80575


[Swift5.3でFunction
Builderについて変数宣言を許すような変更がなされたようですが、仕様決定フローもしくは決定後の仕様を示したドキュメントを探しています](https://ja.stackoverflow.com/q/78444)

の質問とも関連するかもなのですが、

[SwiftUI 2.0 Custom Animated Indicator For Page Tab View - Custom Animations -
SwiftUI Tutorials (YouTube)](https://www.youtube.com/watch?v=uo8gj7RT3H8)

で使われている

[code]

    .background(
        GeometryReader { g -> Color in
            print("Hoge")
            return Color(.clear)
        }
    )
    
[/code]

というのは、どういった文法テクニックなのでしょうか？  
クロージャーの返り値をColorと明示しない場合は、下記のようにprintの返り値を受けないといけません。

[code]

    .background(
        GeometryReader { g in
            let _ = print("Hoge")  // <-- let _ = が必要
            Color(.clear)
        }
    )
    
[/code]

なんとなく返り値を明示するとFunction Builderではなくなって、  
普通のクロージャになっている気がするのですが、どういう原理なんでしょうか？


CC BY-SA 4.0
2021-08-02T06:24:12.557
80537
2021-08-04T00:13:45.633
2021-08-04T00:13:45.633
3060
9008
question
swift swiftui
返り値を明示するとprintを直書きしても文法エラーにならないテクニックはどういう原理ですか？


`ViewBuilder`は、Appleの独自実装の扱いだった`_functionBuilder`から、Swift
5.4以降は名称の変更された`resultBuilder`として実装されています。

[SE-0289 Result builders](https://github.com/apple/swift-
evolution/blob/main/proposals/0289-result-builders.md)

その中にこんな記載があります。

> ### 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コンパイラのバージョンによっては、挙動が変化する可能性はあるかと思います。


CC BY-SA 4.0
2021-08-03T23:24:22.297
80575
2021-08-03T23:24:22.297
13972
80537
answer