所以我有這個TestView接受headerContent和bodyContent,
struct TestView<Content: View>: View {
let headerContent: (() -> Content)? = nil
let bodyContent: () -> Content
var body: some View {
VStack {
headerContent?()
bodyContent()
}
}
}
我用它作為,
struct ContentView: View {
var body: some View {
TestView {
Text("Body Content")
}
}
}
現在,我如何通過headerContent?我試著做,
struct ContentView: View {
var body: some View {
TestView(headerContent: {
Text("HeaderContent")
}) {
Text("BodyContent")
}
}
}
我得到錯誤,
Extra arguments at positions #1, #2 in call
Generic parameter 'Content' could not be inferred
uj5u.com熱心網友回復:
方式一:
這是一種方法,但是如果您的 headerView 型別與正文內容不同,則會出現問題和錯誤!例如圓形和文本。我用第二種方式解決了這個問題:
struct TestView<Content: View>: View {
@ViewBuilder let headerContent: (() -> Content)?
@ViewBuilder let bodyContent: () -> Content
init(headerContent: (() -> Content)? = nil, bodyContent: @escaping () -> Content) {
self.headerContent = headerContent
self.bodyContent = bodyContent
}
var body: some View {
return VStack {
headerContent?()
bodyContent()
}
}
}
方式2:
這是適合您的正確方法:
struct TestView<BodyContent: View, HeaderContent: View>: View {
@ViewBuilder let headerContent: () -> HeaderContent
@ViewBuilder let bodyContent: () -> BodyContent
init(headerContent: @escaping () -> HeaderContent, bodyContent: @escaping () -> BodyContent) {
self.headerContent = headerContent
self.bodyContent = bodyContent
}
init(bodyContent: @escaping () -> BodyContent) where HeaderContent == EmptyView {
self.headerContent = { EmptyView() }
self.bodyContent = bodyContent
}
var body: some View {
return VStack {
headerContent()
bodyContent()
}
}
}
用例:
struct ContentView: View {
var body: some View {
TestView(headerContent: {
Circle().fill(Color.red).frame(width: 25, height: 25)
}, bodyContent: {
Text("Hello, World!")
})
TestView(bodyContent: {
Text("Hello, World!")
})
}
}
uj5u.com熱心網友回復:
只是讓它var(即可變)而不是let,像
struct TestView<Content: View>: View {
var headerContent: (() -> Content)? = nil // << here !!
...
uj5u.com熱心網友回復:
將您的可選變數從 更改let為var。
當您使用let關鍵字定義變數時,您無法更改它。在您的示例中,您已將 nil 設定為 a 的常量headerContent。
struct TestView<Content: View>: View {
var headerContent: (() -> Content)? = nil
let bodyContent: () -> Content
您還可以使用let與init
struct TestView<Content: View>: View {
let headerContent: (() -> Content)?
let bodyContent: () -> Content
init(headerContent: (() -> Content)? = nil, bodyContent: @escaping () -> Content) {
self.headerContent = headerContent
self.bodyContent = bodyContent
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367360.html
