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