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
        ))
    }
}
Другие вопросы по тегам