【问题标题】:Swift closure syntax using { ... in }使用 { ... in } 的 Swift 闭包语法
【发布时间】:2020-06-12 09:58:31
【问题描述】:

Apple SwiftUI Tutorial: Drawing Paths and Shapes 上,显示以下语法:

struct Badge: View {
    var body: some View {
        GeometryReader { geometry in
            Path { path in
            ...
            }
            .fill(Color.black)
        }
    }
}

没有看到Swift docs on structs中的语法,感觉很迷茫。

此外,无论这意味着什么,人们怎么会知道geometry 是“在”GeometryReader 语句中的?

【问题讨论】:

标签: ios swift syntax swiftui


【解决方案1】:

这与结构无关。这就是闭包语法,其中in 之前的变量名是闭包的输入参数。

在 SwiftUI 的上下文中,该闭包实际上是一个 ViewBuilder,它是一个特定类型的函数构建器。您可以阅读更多关于函数阅读器和其他使 SwiftUI 成为可能的语法糖here

您可以通过在 Xcode 中单击它们来了解闭包输入参数的类型,就像任何其他变量一样。或者您可以查看GeometryReader 的文档以了解其闭包接受哪些输入参数。

【讨论】:

  • 谢谢!但我认为您必须明确声明闭包的返回类型,即使它是 -> ()?
  • @CalvinXu 不确定您为什么认为是这种情况,但这是不正确的。编译器在大多数情况下可以推断返回类型,因此无需显式声明。
【解决方案2】:

这是尾随闭包的简化语法,所以

Path { path in
...
}

一样
Path( { (path) in
...
})

使用的Path 构造函数

/// Initializes to an empty path then calls `callback` to add
/// the initial elements.
public init(_ callback: (inout Path) -> ())

顺便说一句,这种语法在 SwiftUI 中被广泛使用,所以你会在 VStack { .. }GeometryReader { g in ... }ScrollView { ... } 以及几乎所有其他 SwfitUI 框架的 UI 元素中看到相同的语法。

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2017-03-17
    • 2021-02-07
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多