将可选回调传递给Swift函数

时间:2014-06-28 12:39:41

标签: function callback functional-programming swift

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

func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

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

有什么建议吗?

3 个答案:

答案 0 :(得分:54)

Swift 3/4的更新:

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

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

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

也采用了可选的闭包:

func dismiss(completion: (() -> Void)? = nil) {
    self.dismiss(animated: true, completion: completion)
}

Old(Swift 1.x?)回答:

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

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

但请注意,您可以致电

self.dismissViewControllerAnimated(true, completion: completion)

在任何情况下,因为该函数的completion参数也是可选的。 并且

func dismissModalViewControllerAnimated(animated: Bool)

实际上已标记为已弃用。

答案 1 :(得分:16)

刚刚在上面添加了Martin R的答案..

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

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

    self.dismissModalViewControllerAnimated(true)
}

答案 2 :(得分:10)

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

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

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