簡體   English   中英

SwiftUI: View with optional inner View

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM