SwiftUI Closures return value

Hello,

Look at this SwiftUI view:

struct ContentView: View
{
    var body: some View
    {
        Text("Hello !")
    }
}

The Text("Hello") line is a closure. Am I wrong ?

There is an implicit return. I can write this:

struct ContentView: View
{
    var body: some View
    {
        return Text("Hello !")
    }
}

I can put multiple lines like this:

struct ContentView: View
{
    var body: some View
    {
        Text("Hello !")
        Text("Hello2 !")
    }
}

I don't understand how works internally the implicit return in this case because we have 2 components.

Also, can you explain me why i can't put a basic swift line code like this:

struct ContentView: View
{
    var body: some View
    {
        Text("Hello !")
        print("Hello")
        Text("Hello2 !")
    }
}

Thanks

Answered by Claude31 in 769632022

var body is a view builder, so, body expect a View to be returned.

Doc explains: https://developer.apple.com/documentation/swiftui/viewbuilder

You typically use ViewBuilder as a parameter attribute for child view-producing closure parameters, allowing those closures to provide multiple child views. For example, the following contextMenu function accepts a closure that produces one or more views via the view builder. Clients of this function can use multiple-statement closures to provide several child views. When you have a single subview, you can add return or omit.

When you have multiple subviews, SwiftUI automatically builds a view, grouping all of them.

This is equivalent to :

struct ContentView: View
{
    var body: some View
    {
        return  Group {
            Text("Hello !")
            Text("Hello2 !")
        }
    }
}

So, you cannot have a print statement in it, because that's not a view.

you're writing to think it doesn't make sense, because var body is doing some sort of meta programming with @ViewBuilder check out what @ViewBuilder does

Accepted Answer

var body is a view builder, so, body expect a View to be returned.

Doc explains: https://developer.apple.com/documentation/swiftui/viewbuilder

You typically use ViewBuilder as a parameter attribute for child view-producing closure parameters, allowing those closures to provide multiple child views. For example, the following contextMenu function accepts a closure that produces one or more views via the view builder. Clients of this function can use multiple-statement closures to provide several child views. When you have a single subview, you can add return or omit.

When you have multiple subviews, SwiftUI automatically builds a view, grouping all of them.

This is equivalent to :

struct ContentView: View
{
    var body: some View
    {
        return  Group {
            Text("Hello !")
            Text("Hello2 !")
        }
    }
}

So, you cannot have a print statement in it, because that's not a view.

SwiftUI Closures return value
 
 
Q