【问题标题】:SwiftUI - Can I define an empty initializer for a generic view?SwiftUI - 我可以为通用视图定义一个空的初始化程序吗?
【发布时间】:2021-02-15 21:25:16
【问题描述】:

我有一个带有可选@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?()
        }
    }
}

如果我使用 ViewBuilder 参数初始化视图,它当然可以工作。但是,当我使用空初始化程序时,我收到错误消息:

无法推断通用参数“内容”

struct ContentView: View {
    var body: some View {
        OptionalViewBuilder {
            Text("Text1")
            Text("Text2")
        }
        OptionalViewBuilder() // <-- Generic parameter 'Content' could not be inferred
    }
}

我知道 Swift 在运行时需要显式类型,但有没有办法让默认初始化程序正常工作?

【问题讨论】:

    标签: swift generics swiftui


    【解决方案1】:

    因为OptionalViewBuilder 相对于它的Content 类型是通用的,所以您需要在默认情况下将该类型定义为something。如果您不想渲染任何内容,这可能是 EmptyView

    为此,您需要一个限制为Content == EmptyViewinit,并且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()
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我可以通过添加一个空闭包来消除编译错误,如下所示:

      struct ContentView: View {
          var body: some View {
              OptionalViewBuilder {
                  Text("Text1")
                  Text("Text2")
              }
              OptionalViewBuilder() {} // I added an empty closure
          }
      }
      

      这能满足你的需要吗?

      【讨论】:

        猜你喜欢
        • 2019-11-16
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 2022-01-13
        • 2011-05-03
        • 1970-01-01
        相关资源
        最近更新 更多