通过Swift闭包时,“在调用中额外参数'完成'

时间:2014-12-04 20:09:18

标签: swift

我已经在UIView上扩展了动画功能,为缩放添加了一些快捷功能,如下所示。

extension UIView {
    class func animatePressed(viewToAnimate: UIView, complete: ((Bool) -> Void)) {
        UIView.animateWithDuration(0.20, delay: 0, options: UIViewAnimationOptions.allZeros, animations: {
            viewToAnimate.transform = CGAffineTransformScale(viewToAnimate.transform, scale, scale)
        }, completion: complete)
    }
}

尝试调用此函数时会出现此问题。因为我只关心动画何时结束,所以我使用'_'符号作为参数占位符。

UIView.animatePressed(messagesImage, complete: { _ in
    self.delegate.newSubViewControllerRequested(UIStoryboard.messageListViewController()!)
})

我收到以下编译错误......

Extra argument 'complete' in call

如果我将代码更改为以下任一项,编译器就会停止抱怨。

UIView.animatePressed(messagesImage, complete: { _ in
    if 1 == 1 {
        self.delegate.newSubViewControllerRequested(UIStoryboard.messageListViewController()!)
    }
})

UIView.animatePressed(messagesImage, complete: { _ in
    self.delegate.newSubViewControllerRequested(UIStoryboard.messageListViewController()!)
    return
})

这是Swift中的错误还是我在这里完全遗漏了什么?

1 个答案:

答案 0 :(得分:2)

都不是。这不是一个Swift错误,而且你没有遗漏任何东西 - 因为事实上你已经正确地解决了这个问题!

问题是,作为一种快捷方式,如果匿名函数只包含一行,Swift会尝试将其用作返回值。但是,该返回值对于(Bool) -> Void无效。

换句话说,当你这么说时:

UIView.animatePressed(messagesImage, complete: { _ in
    self.delegate.newSubViewControllerRequested(UIStoryboard.messageListViewController()!)
})

就像你说的那样:

UIView.animatePressed(messagesImage, complete: { _ in
    return self.delegate.newSubViewControllerRequested(UIStoryboard.messageListViewController()!)
})

但你不能这么说,因为你的newSubViewControllerRequested会返回一个实际的非Void值。所以现在你的类型不匹配了;这个匿名函数不符合所需的签名。

因此,解决方法正是您所做的 - 向匿名函数添加更多行(以禁止快捷方式),和/或提供显式的void返回值。