Function 将可选回调传递给Swift函数

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

我正在学习Swift lang,但我无法将可选回调参数传递给函数:

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) }