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?()
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…