Kev*_*inP 5 generics swift swiftui
我有一个带有可选的通用视图@ViewBuilder。我想要两个初始值设定项,一个负责设置@ViewBuilder,另一个应作为空的默认值。
struct OptionalViewBuilder<Content: View>: View {
let content: (() -> Content)?
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
init() {
self.content = nil
}
var body: some View {
VStack {
Text("Headline")
Divider()
content?()
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用 ViewBuilder 参数初始化视图,它当然可以工作。但是,当我使用空的初始化程序时,我收到错误消息:
无法推断通用参数“内容”
struct ContentView: View {
var body: some View {
OptionalViewBuilder {
Text("Text1")
Text("Text2")
}
OptionalViewBuilder() // <-- Generic parameter 'Content' could not be inferred
}
}
Run Code Online (Sandbox Code Playgroud)
我知道 Swift 在运行时需要显式类型,但是有没有办法让默认的初始化器工作呢?
由于OptionalViewBuilder其类型是通用的Content,因此您需要将该类型定义为默认情况下的类型。EmptyView如果您不想渲染任何内容,这可能是。
为此,您需要一个initwhich 被限制为Content == EmptyView,并且该content属性不必是可选的:
struct OptionalViewBuilder<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
init() where Content == EmptyView {
self.init(content: { EmptyView() })
}
var body: some View {
VStack {
Text("Headline")
Divider()
content()
}
}
}
Run Code Online (Sandbox Code Playgroud)