SwiftUI - 我可以为通用视图定义一个空的初始值设定项吗?

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 在运行时需要显式类型,但是有没有办法让默认的初始化器工作呢?

New*_*Dev 6

由于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)