【问题标题】:Returning multiple View objects from a closure in Swift [duplicate]从Swift中的闭包返回多个视图对象[重复]
【发布时间】:2021-06-16 16:10:47
【问题描述】:

我经常看到这样的代码:

VStack {
  Text("A")
  Text("B")
}

通过查看 swift 教程,我知道这是将闭包指定为函数的最后一个参数的简写。但是,afaik 如果未指定 return 关键字,则闭包将隐式返回内部表达式的结果。

在这种情况下,有两个 Text 对象。它们是作为元组还是列表返回?我知道它有效,但我不清楚从关闭中返回的究竟是什么。

【问题讨论】:

    标签: ios swift swiftui closures


    【解决方案1】:

    当我们看到这段代码时:

    VStack {
      Text("A")
      Text("B")
    }
    

    不清楚会返回什么,除非我们使用VStack,那么SwiftUI就知道我们想要什么,代码可能是这样的:

    HStack {
      Text("A")
      Text("B")
    }
    

    这里也不清楚我们想要什么,除非我们对 SwiftUI 说我们想要HStack,但是如果你这样使用:

    CustomView {
      Text("A")
      Text("B")
    }
    

    SwiftUI 始终将其返回为VStack 内部内容!同样在我所说的所有这些情况下,Swift 与@ViewBuilder 合作以实现这一目标。它们是元组。

    ViewBuilder Apple

    【讨论】:

      【解决方案2】:

      SwiftUI 会自动返回一个 TupleView 类型的两个 Text。 Swift 的 resultBuilder 很神奇,就是 SE0289:https://github.com/apple/swift-evolution/blob/main/proposals/0289-result-builders.md

      【讨论】:

      • 谢谢,这正是我想要的 :)
      【解决方案3】:

      Swift Evolution 255 中引入了省略 return 语句的初始功能 - 此更改仅允许单个返回值。事实上,在这个提案中考虑了返回多个值的能力并放弃了。

      您询问的结构最初是由 Apple 作为支持 SwiftUI 的私有实现引入的,但现在已在 Swift Evolution 289 - Function Builders 中正式采用。

      通过参考该文档的introduction 部分,您可以看到这些值确实以元组的形式返回。

      // Original source code:
      @TupleBuilder
      func build() -> (Int, Int, Int) {
        1
        2
        3
      }
      
      // This code is interpreted exactly as if it were this code:
      func build() -> (Int, Int, Int) {
        let _a = TupleBuilder.buildExpression(1)
        let _b = TupleBuilder.buildExpression(2)
        let _c = TupleBuilder.buildExpression(3)
        return TupleBuilder.buildBlock(_a, _b, _c)
      }
      

      【讨论】:

      • 它仍然让我惊讶于 Swift 语言的强大程度。感谢您的回答,它解决了我所有的问题。
      • @BenjaminTamasi 不强大,一团糟。
      猜你喜欢
      • 2015-10-11
      • 2015-01-15
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2015-09-12
      • 2012-02-14
      相关资源
      最近更新 更多