Ios SwiftUI,在@Viewbuilder中将视图作为参数传递

Ios SwiftUI,在@Viewbuilder中将视图作为参数传递,ios,struct,swiftui,swift-protocols,viewbuilder,Ios,Struct,Swiftui,Swift Protocols,Viewbuilder,我的好奇心驱使我将视图类型作为参数传递给@ViewBuilder。在@ViewBuilder中将模型/基元类型作为参数传递是完全有效的 如下代码所示 struct TestView<Content: View>: View { let content: (String) -> Content init(@ViewBuilder content: @escaping (String) -> Content) { self.

我的好奇心驱使我将
视图
类型作为参数传递给
@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)")
        }
    }
}
若我试图传递一个SwiftUI
视图
类型,那个么编译器对它不满意

let content: (View) -> Content
即使
@ViewBuilder
的参数接受自定义协议类型,如
可搜索
,但不接受
查看
协议

编译器告诉我此
协议“视图”只能用作一般约束,因为它具有自身或关联的类型要求

我的全部想法是允许
内容
保存
节/列表/文本

编辑:我希望代码如下

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
            }
        }
    }
}
struct TestView:View{
让内容:(查看)->内容
初始化(@ViewBuilder内容:@escaping(视图)->content){
self.content=内容
}
var body:一些观点{
内容(
名单{
ForEach(0..in
节(标题:文本(“标题在此处”)){
视图体
}
}
}
}

有什么办法可以做到这一点吗?

可能的解决方案是使用
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
        ))
    }
}
struct TestView:View{
让内容:(AnyView)->content
初始化(@ViewBuilder内容:@escaping(AnyView)->content){
self.content=内容
}
var body:一些观点{
内容(任意视图)(

Text(“Demo”)//非常有趣……在继续之前……您希望如何在
TestView{???中使用它,因为???将是一个不透明的未知对象,对于您来说,view?@Asperi更新了预期的代码。感谢您的回答,它按预期工作。不建议使用
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
        ))
    }
}