Skip to content

[SR-13188] Please support @ViewBuilder for properties #55628

Description

@twostraws
Previous ID SR-13188
Radar None
Original Reporter @twostraws
Type New Feature
Status Resolved
Resolution Done
Additional Detail from JIRA
Votes 1
Component/s Compiler
Labels New Feature, FunctionBuilder, TypeChecker
Assignee None
Priority Medium

md5: 7cb2c7fde2a7f991ee63ebf387d335e3

Issue Description:

I would like you consider adding support for @ViewBuilder to be used with properties, so that the memberwise initializer Swift generates for structs automatically gains that function builder.

As an example, if I wanted to implement a custom SwiftUI VStack right now, I might start with this:

struct CustomVStack<Content: View>: View {
    let content: () -> Content

    var body: some View {
        VStack {
            // custom stuff here
            content()
        }
    }
}

However, that doesn't support @ViewBuilder, and so this kind of code would not work:

CustomVStack {
    Text("Hello")
    Text("Hello")
}

To fix this, I need to define a custom initializer:

init(@ViewBuilder content: @escaping () -> Content) {
    self.content = content
}

In this simple example it isn't a massive problem, but often that initializer has to copy in lots of values – it does exactly what the memberwise initializer did now just with @ViewBuilder for the single content property.

Ideally I'd like to be able to write something along these lines:

struct CustomVStack<Content: View>: View {
    @ViewBuilder let content: () -> Content

    var body: some View {
        VStack {
            // do stuff
            content()
        }
    }
}

Thank you!

Activity

  1. theblixguy commented on Jul 9, 2020

    @theblixguy
    Member

    Maybe we can make this work by allowing users to add the function builder attribute on the type declaration i.e. let foo: @BarBuilder () -> T and then cloning it to the corresponding member-wise initializer parameter.

  2. DougGregor commented on Sep 27, 2020

    @DougGregor
    Member

    Implementation in #34097 which is going through CI now

  3. added
    featureA feature request or implementation
    memberwise initFeature: Memberwise structure initializers
    structFeature → type declarations: Structure declarations
    swift evolution implementedFlag → feature: A feature that was approved through the Swift evolution process and implemented
    and removed on Feb 24, 2023
  4. AnthonyLatsis commented on Feb 24, 2023

    @AnthonyLatsis
    Collaborator

    Implemented as part of SE-0289

  5. malhal commented on Jul 29, 2026

    @malhal

    Here is fixed link to SE-0289 and we just need Content not () -> Content, e.g.

    struct CustomHStack<Content: View>: View {
        @ViewBuilder let content: Content
    
        var body: some View {
            HStack {
                // custom stuff here
                content
            }
        }
    }
    

    The implicit memberwise initializer has the following definition:

    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    compilerThe Swift compiler itselfmemberwise initFeature: Memberwise structure initializersresult buildersFeature: Result buildersstructFeature → type declarations: Structure declarationsswift evolution implementedFlag → feature: A feature that was approved through the Swift evolution process and implementedtype checkerArea → compiler: Semantic analysis

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions