【问题标题】:How to write a function that takes a closure of a view and returns a view?如何编写一个关闭视图并返回视图的函数?
【发布时间】:2021-04-20 01:00:06
【问题描述】:

我想编写与视图一起使用的实用程序,以执行诸如有条件地显示视图之类的操作,并执行诸如 intersperse 之类的操作,其中重复视图并在每次迭代之间插入某种分隔符。我不知道如何定义函数类型签名。这是我到目前为止得到的:

    func ifNotLastCategory(_ cat: String, content: () -> AnyView) -> AnyView {
        if (cat != movie.categories.last) { return content() }
    }


    ...
    
    ifNotLastCategory(category) { Text("Hello World") }

当我尝试做类似的事情时,我收到一个关于 Cannot convert value of type 'some View' to closure result type 'AnyView' 的编译器错误。但是它不会让我将content 定义为返回some View

我怎样才能使这个功能起作用?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    尽量不要使用AnyView,除非你真的有充分的理由。在大多数情况下,您可以使用其他更高效更清洁的解决方案。

    在您的情况下,我建议使用@ViewBuilder 并返回一些视图

    @ViewBuilder
    func ifNotLastCategory<V: View>(_ cat: String, content: () -> V) -> some View {
        if cat != movie.categories.last {
            content()
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用泛型函数并将结果转换为AnyView

      func ifNotLastCategory<V: View>(_ cat: String, content: () -> V) -> AnyView {
          if cat != movie.categories.last { return AnyView(content()) }
          return AnyView(EmptyView())
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-23
        • 2011-07-16
        • 1970-01-01
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多