Я бы предложил использовать ViewModifyer
вместо пользовательских видов. Они работают следующим образом:
struct SideContent<SideContent: View>: ViewModifier {
var title: String
var sideContent: (() -> SideContent)?
init(title: String) {
self.title = title
}
init(title: String, @ViewBuilder sideContent: @escaping () -> SideContent) {
self.title = title
self.sideContent = sideContent
}
func body(content: Content) -> some View {
HStack {
VStack {
Text(title)
content
}
sideContent?()
}
}
}
Это может использоваться как SomeView().modifier(SideContent(title: "asdasd") { Text("asdasd")})
, однако, если вы опустите сторону, вам все равно нужно будет указать ее тип SomeView().modifier(SideContent<EmptyView>(title: "asdasd"))
ОБНОВЛЕНИЕ
Удаление заголовка упрощает, как вы упомянули.
struct SideContent<SideContent: View>: ViewModifier {
var sideContent: (() -> SideContent)
init(@ViewBuilder sideContent: @escaping () -> SideContent) {
self.sideContent = sideContent
}
func body(content: Content) -> some View {
HStack {
content
sideContent()
}
}
}
Также вы можете сделать модификатор для Title
.
struct Titled: ViewModifier {
var title: String
func body(content: Content) -> some View {
VStack {
Text(title)
content
}
}
}
SomeView()
.modifier(Titled(title: "Title"))
.modifier(SideContent { Text("Side") })