[英]SwiftUI: View with optional inner View
我正在嘗試創建一個SwiftUI
視圖,它可能包含另一個這樣的視圖:
struct EmptyPlaceholderView<Header: View>: View {
let header: Header?
let text: LocalizedStringKey
init(header: Header? = nil, text: LocalizedStringKey) {
self.header = header
self.text = text
}
var body: some View {
VStack(spacing: 8) {
if let header = self.header {
header
}
Text(text)
.scaledFont(.title)
.foregroundColor(.gray500)
}
}
}
此代碼塊編譯沒有問題,但是當我嘗試像這樣調用此視圖時: EmptyPlaceholderView(text: "No Data")
編譯器會引發以下錯誤:
Generic parameter 'Header' could not be inferred
我該如何解決這個問題?
您已經使您的視圖在Header
上通用,因此即使header
屬性為nil
,您也必須始終指定通用類型。
例如,當您不想擁有Header
時,可以使用EmptyView
EmptyPlaceholderView<EmptyView>(text: "No data")
或者,您可以添加一個新的init
,它只接受一個text
參數,而不是給header
一個nil
默認值。 有了這個新 init 的通用類型約束,您將不必再指定Header
的類型,因為它將被推斷為EmptyView
。
init(text: LocalizedStringKey) where Header == EmptyView {
self.header = nil
self.text = text
}
init(header: Header?, text: LocalizedStringKey) {
self.header = header
self.text = text
}
現在EmptyPlaceholderView(text: "No data")
可以正常編譯並創建一個EmptyPlaceholderView<EmptyView>
。
對於 generics,在專門化過程中應始終指定(顯式或推斷)類型,因此可能的解決方案是為此使用 helper init
,例如
init(text: LocalizedStringKey) where Header == EmptyView {
self.init(header: nil, text: text)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.