Function 将可选回调传递给Swift函数
我正在学习Swift lang,但我无法将可选回调参数传递给函数:Function 将可选回调传递给Swift函数,function,callback,functional-programming,swift,Function,Callback,Functional Programming,Swift,我正在学习Swift lang,但我无法将可选回调参数传递给函数: func dismiss(completion: () -> Void) { if (completion) { return self.dismissViewControllerAnimated(true, completion: completion) } self.dismissModalViewControllerAnimated(true) } 这显示了一个错误-Type
func dismiss(completion: () -> Void) {
if (completion) {
return self.dismissViewControllerAnimated(true, completion: completion)
}
self.dismissModalViewControllerAnimated(true)
}
这显示了一个错误-Type()->Void不符合协议“LogicValue”
有什么建议吗?Swift 3/4更新: 可选表达式不再是布尔表达式,并且 不推荐使用的
func解除Modalviewcontrolleranimated(动画:Bool)
在Swift中不再可用
只需将完成参数声明为可选闭包,然后
传给
func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)
这也需要一个可选的闭包:
func dismiss(completion: (() -> Void)? = nil) {
self.dismiss(animated: true, completion: completion)
}
旧(Swift 1.x?)答案: 将
completion
参数声明为(隐式展开的)可选闭包(()->Void)代码>:
但请注意,你可以打电话
self.dismissViewControllerAnimated(true, completion: completion)
在任何情况下,因为该函数的completion
参数也是可选的。
及
实际上被标记为已弃用。只是补充了上面Martin R的答案
回调可以是可选的,而不是隐式参数(带感叹号),请使用可选运算符
func dismiss(completion: (() -> Void)?) {
if completion != nil {
return self.dismissViewControllerAnimated(true, completion: completion!)
}
self.dismissModalViewControllerAnimated(true)
}
最好在回调声明中添加=nil
,以避免在调用它时传递nil:
func dismiss(completion: (() -> Void)? = nil) {
if (completion) {
return self.dismissViewControllerAnimated(true, completion: completion)
}
self.dismissModalViewControllerAnimated(true) }
您可以这样调用您的函数:disclesh()
您的代码在功能上是否与Martin R的不同?逻辑上看起来是一样的。逻辑上是一样的,尽管你可能会说使用函数的语法是不同的。谢谢。我只是想确定我明白了。从我所能看到的,这在逻辑上与Martin R上面的答案不一样。这看起来像是将完成闭包定义为可选的,其中Martin R的答案看起来像是显式地打开了值,如果传入nil闭包,该值将导致运行时错误。在这种特定情况下,这并不太重要,但请注意,如果在调用之前忘记检查nil,则使用隐式unwrapped optional将导致崩溃。然而,如果你在代码忍者的答案中使用了一个常规的可选选项,编译器会将你从自己手中解救出来,你会强迫你写补全?()(如果补全为零,它不会崩溃。你能解释一下为什么(()->Void)!
定义一个可选的闭包?据我所知,如果您在中传递了一个nil完成处理程序,那么打开nil值的尝试不会导致运行时错误吗?@MatthewCawley:隐式打开的可选闭包也是可选的,是的,您必须测试它是否可能是nil,这就是if(completion)的意思
did。上面的答案很旧(Swift 1.x),我必须承认,我不记得为什么我选择了IUO而不是强可选选项。也许这就是func dismissViewControllerAnimated(u:completion:)的参数类型
当时。-但是代码已经过时,不再编译,我已经为当前的Swift更新了它。
func dismiss(completion: (() -> Void)?) {
if completion != nil {
return self.dismissViewControllerAnimated(true, completion: completion!)
}
self.dismissModalViewControllerAnimated(true)
}
func dismiss(completion: (() -> Void)? = nil) {
if (completion) {
return self.dismissViewControllerAnimated(true, completion: completion)
}
self.dismissModalViewControllerAnimated(true) }