我已经在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中的错误还是我在这里完全遗漏了什么?
答案 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返回值。