我在Xcode 9 Beta 3中使用了3rd party library。我在完成调用中遇到以下错误,我无法解决此错误:
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.animationView?.alpha = 0
self.containerView.alpha = 1
completion?() // -> Error: Missing argument parameter #1 in call.
}
在完成功能中收到以下警告:
func openAnimation(_ completion: ((Void) -> Void)?) {
// -> Warning: When calling this function in Swift 4 or later, you must pass a '()' tuple; did you mean for the input type to be '()'?
}
答案 0 :(得分:19)
在Swift 4中,元组的处理比以前更加严格。
此闭包类型:(Void)->Void
表示闭包
Void
Void
,意味着不返回值所以,请尝试以下任何一项:
将类型Void
的值传递给闭包。 (空元组()
是Void
的唯一实例。)
completion?(())
否则:
更改参数completion
的类型。
func openAnimation(_ completion: (() -> Void)?) {
//...
}
请记住,即使在Swift 3中,两种类型(Void)->Void
和()->Void
也是不同的。如果您打算表示没有参数的闭包类型,那么后者是合适的。
这个更改是SE-0029 Remove implicit tuple splat behavior from function applications的一部分,据说是在Swift 3中实现的,但似乎Swift 3还没有完全实现它。
在这里,我向您展示了一个简化的检查代码,您可以在Playground上查看差异。
import Foundation
//### Compiles in Swift 3, error and warning in Swift 4
class MyClass3 {
func openAnimation(_ completion: ((Void) -> Void)?) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
completion?()
}
}
}
//### Compiles both in Swift 3 & 4
class MyClass4 {
func openAnimation(_ completion: (() -> Void)?) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
completion?()
}
}
}