在参数传递时编译Swift 4中的错误

时间:2017-07-19 07:39:01

标签: swift ios11 xcode9-beta swift4

我在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 '()'?
}    

1 个答案:

答案 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?()
        }
    }

}