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

问题描述 投票:0回答:1

我对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()
            })
        }

我想知道是否有人会好心地给我链接一个文档或解释这个推理背后的意义,因为我无法判断这是SwiftUI的一个怪癖,还是仅仅是我自己关闭知识的失误。我们也欢迎其他的解决方案。

-谢谢大家

swift swiftui alert
1个回答
1
投票

一开始肯定会有点混乱!Xcode的选项键是你的选择。

Xcode的选项键是你的朋友。选项键点击几乎任何东西来查看文档或声明。

让我们来分析一下。首先,让我们简化一下。

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's .default() 静态函数,返回一个初始化的 Alert.Button.

而且 Alert.Button.default() 需要一些参数。下面是当你在选项卡上点击 .default 方法。

enter image description here

这应该看起来很像一个普通的老 Button(). 那按钮有什么呢?一个标签和一个动作,当你点击它的时候。

所以你看到的那个额外的闭合实际上是按钮的动作闭合。

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

所以你已经得到了 .default() 函数,然后将其传递给被调用的尾部闭合的 Alert()'s 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(...) {...})

这样做有意义吗?

© www.soinside.com 2019 - 2024. All rights reserved.