关于 Alert() 调用中额外闭包的问题(SwiftUI)

Question about extra closures in Alert() call (SwiftUI)

我对 Swift 有点生疏,因为它对我来说是一种新语言,我对闭包并不陌生,但是由于过去使用 Javascript 的一些经验。我对警报调用非常熟悉和满意,但最近 运行 遇到了一个问题,我想在警报解除后执行一个函数。我找到了一个解决方案,但对为什么允许程序员简单地 在警报调用或任何结构调用中的右括号之前打开一个闭包感到困惑 .

.alert(isPresented: $bindingVariable) {
            Alert(title: Text("Title"), message: Text("Message"), dismissButton: .default(Text("Continue")) {
                //this closure is where my confusion lies
                self.functionCall()
            })
        }

我想知道是否有人会 link 给我一份文件或解释这个推理背后的意义,因为我不知道这是 SwiftUI 怪癖还是只是我自己的闭包知识的一个失误。也欢迎替代解决方案!

-谢谢大家

一开始肯定会有点混乱!

Xcode的选项键是你的朋友。按住 Option 键并单击任何内容以查看文档或声明。

让我们分解一下。首先,让我们简化一下:

Alert(title: Text("Title"), message: Text("Message"), dismissButton: .default(Text("Continue")) {
    //this closure is where my confusion lies
    self.functionCall()
})

为此:

let alertButton: Alert.Button()
Alert(title: Text("Title"), message: Text("Message"), dismissButton: alertButton)

这就是那里发生的一切。但是您已经将 dismissButton 参数值直接编码到 Alert.

当然,上面带有 let 常量的存根是行不通的,因为我们还没有初始化 Alert.Button.

您的代码所做的是将 Alert.Button.default() 静态函数调用到 return 已初始化的 Alert.Button

Alert.Button.default()需要一些参数。这是您在按住 Option 键并单击 .default 方法时获得的文档:

那看起来应该很像普通的旧 Button()。按钮有什么?单击它时的标签和操作。

所以您看到的额外关闭实际上是按钮的操作关闭。

当然,就像 Swift 中的其他地方一样,因为 Alert.Button.default() 方法的最终参数(在本例中为 action)是一个闭包,您可以在括号外指定它.default() 方法调用。

因此,您已使用尾随闭包调用 .default() 函数,然后传递给 Alert()dismissButton 参数。

如果你把它拆开,它看起来像这样:

let alertButton = Alert.Button().default(Text("Continue")) {
    //this closure is where my confusion lies
    self.functionCall()
}

Alert(title: Text("Title"), message: Text("Message"), dismissButton: alertButton)

在您发布的代码中,.default() 调用恰好被内联编码到 Alert() 初始化参数中。因此,在带有尾随闭包的函数调用周围加上括号:

Alert( ... dismissButton: .default(...) {...})

这有意义吗?