SwiftUI:带有可选内部视图的视图



我正在尝试创建一个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>

对于泛型,应该在专门化期间始终指定类型(显式地或推断地),因此可能的解决方案是使用辅助init,如

init(text: LocalizedStringKey) where Header == EmptyView {
self.init(header: nil, text: text)
}

最新更新