我正在嘗試創建一個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
我該如何解決這個問題?
uj5u.com熱心網友回復:
您已經使視圖泛型 over Header,因此即使header屬性是nil,您也必須始終指定泛型型別。
例如,當您EmptyView不想擁有Header
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>.
uj5u.com熱心網友回復:
對于泛型,在專業化期間應始終指定(顯式或推斷)型別,因此可能的解決方案是為此提供幫助init,例如
init(text: LocalizedStringKey) where Header == EmptyView {
self.init(header: nil, text: text)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465193.html
