关于 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(...) {...})
这有意义吗?
我对 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(...) {...})
这有意义吗?