我在Xcode 9 Beta 3中使用了3rd party库。在完成调用中出现以下错误,我无法解决此错误:
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 '()'? }
在Swift 4中,对元组的处理比以往更加严格。
这种关闭类型:(Void)->Void表示一个关闭
(Void)->Void
Void
因此,请尝试以下任一方法:
将类型的值传递Void给闭包。(一个空元组()是的唯一实例Void。)
()
completion?(())
要不然:
更改参数的类型completion。
completion
func openAnimation(_ completion: (() -> Void)?) { //... }
请记住,两种类型的(Void)->Void和()->Void甚至在斯威夫特3.不同的,所以后者将是适当的,如果你打算代表 不带参数的闭合型 。
()->Void
这项更改是SE-0029从功能应用程序中删除隐式元组splat行为的一部分,该行为据说已在Swift 3中实现,但看来Swift 3尚未完全实现。
在这里,我向您展示了一个简化的检查代码,您可以在操场上检查差异。
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?() } } }