将可选回调传递给Swift函数

Kos*_*ika 46 functional-programming function callback swift

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

func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}
Run Code Online (Sandbox Code Playgroud)

这显示了一个错误 - Type () -> Void does not conform to protocol 'LogicValue'

有什么建议?

Mar*_*n R 57

Swift 3/4更新:

可选不再是布尔表达式,并且func dismissModalViewControllerAnimated(animated: Bool) 在Swift中不再使用已弃用的表达式.

只需将completion参数声明为可选闭包,并将其传递给

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)
Run Code Online (Sandbox Code Playgroud)

它还带有一个可选的闭包:

func dismiss(completion: (() -> Void)? = nil) {
    self.dismiss(animated: true, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)

老(斯威夫特1.x?)回答:

completion参数声明为(隐式解包)可选闭包(() -> Void)!:

func dismiss(completion: (() -> Void)!) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}
Run Code Online (Sandbox Code Playgroud)

但请注意,你可以打电话

self.dismissViewControllerAnimated(true, completion: completion)
Run Code Online (Sandbox Code Playgroud)

在任何情况下,因为该completion函数的参数也是可选的.和

func dismissModalViewControllerAnimated(animated: Bool)
Run Code Online (Sandbox Code Playgroud)

实际上标记为已弃用.


cod*_*nja 16

刚刚加入Martin R的答案......

回调可以是可选的,而不是隐式参数(带感叹号),使用可选运算符.

func dismiss(completion: (() -> Void)?) {
    if completion != nil {
        return self.dismissViewControllerAnimated(true, completion: completion!)
    }

    self.dismissModalViewControllerAnimated(true)
}
Run Code Online (Sandbox Code Playgroud)


Rém*_*rin 11

最好= nil在回调声明中添加,以避免在调用它时传递nil:

func dismiss(completion: (() -> Void)? = nil) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true) }
Run Code Online (Sandbox Code Playgroud)

你可以像这样调用你的函数: dismiss()