我很好奇能否将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
类型,那么编译器就不会满意。
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
}
}
}
}
有没有办法可以实现这个?
TestView { ??? in
中使用它,因为对于你来说,??? 将是一个不透明的未知视图? - Asperi