Repository navigation
[SR-13188] Please support @ViewBuilder for properties #55628
Description
| 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
theblixguy commentedon Jul 9, 2020
Maybe we can make this work by allowing users to add the function builder attribute on the type declaration i.e.
let foo: @BarBuilder () -> Tand then cloning it to the corresponding member-wise initializer parameter.DougGregor commentedon Sep 27, 2020
Implementation in #34097 which is going through CI now
AnthonyLatsis commentedon Feb 24, 2023
Implemented as part of SE-0289
malhal commentedon Jul 29, 2026
Here is fixed link to SE-0289 and we just need
Contentnot() -> Content, e.g.The implicit memberwise initializer has the following definition: