SwiftUI, передача представления как параметров в @Viewbuilder
Мое любопытство заставляет меня пройти
View
введите как параметр для
@ViewBuilder
. Передача типа модели / примитива в качестве параметра в
@ViewBuilder
совершенно верно.
Как показано ниже, код.
struct TestView<Content: View>: View {
let content: (String) -> Content
init(@ViewBuilder content: @escaping (String) -> Content) {
self.content = content
}
var body: some View {
content("Some text")
}
}
struct ContentTestView: View {
var body: some View {
TestView {
Text("\($0)")
}
}
}
На месте
String
в
let content: (String) -> Content
Если я попытаюсь передать SwiftUI
View
type, то компилятору это не нравится.
let content: (View) -> Content
Хотя параметры для
@ViewBuilder
принимает пользовательский тип протокола, например
Searchable
но нет
View
протокол.
компилятор скажи мне это
Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements
Вся моя идея в том, что
content
можно позволить держать
Section/List/Text
в этом.
Изменить: я ожидал кода, как показано ниже.
struct TestView<Content: View>: View {
let content: (View) -> Content
init(@ViewBuilder content: @escaping (View) -> Content) {
self.content = content
}
var body: some View {
content(
List {
ForEach(0..<10) { i in
Text(\(i))
}
}
)
}
}
struct ContentTestView: View {
var body: some View {
TestView { viewbody -> _ in
Section(header: Text("Header goes here")) {
viewbody
}
}
}
}
В любом случае я могу этого добиться?
1 ответ
Возможное решение - использовать
AnyView
, нравиться
struct TestView<Content: View>: View {
let content: (AnyView) -> Content
init(@ViewBuilder content: @escaping (AnyView) -> Content) {
self.content = content
}
var body: some View {
content(AnyView(
Text("Demo") // << put here any view hierarchy
))
}
}