Compile error in Swift 4 on parameter passing

In Swift 4, tuples are treated more stricter than ever.

This closure type: (Void)->Void means a closure which

  • takes a single argument, of which the type is Void
  • returns Void, meaning returns no value

So, try any of the followings:

Pass a value of type Void to the closure. (An empty tuple () is the only instance of Void.)

completion?(())

Or else:

Change the type of the parameter completion.

func openAnimation(_ completion: (() -> Void)?) {
    //...
}

Remember, two types (Void)->Void and ()->Void are different even in Swift 3. So the latter would be appropriate, if you intend to represent closure type with no arguments.

This change is part of SE-0029 Remove implicit tuple splat behavior from function applications which is said to be implemented in Swift 3, but it seems Swift 3 has not implemented it completely.


Here, I show you a simplified checking code which you can check the difference on the 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?()
        }
    }

}

Leave a Comment