Swift 4 参数传递中的编译错误
Compile error in Swift 4 on parameter passing
我在 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 '()'?
}
在 Swift 4 中,元组的处理比以往任何时候都更加严格。
这个闭包类型:(Void)->Void
表示一个闭包
- 接受一个参数,类型为
Void
- returns
Void
,意思是returns没有值
所以,请尝试以下任一方法:
将 Void
类型的值传递给闭包。 (空元组 ()
是 Void
的唯一实例。)
completion?(())
否则:
更改参数类型completion
。
func openAnimation(_ completion: (() -> Void)?) {
//...
}
请记住,(Void)->Void
和 ()->Void
这两种类型即使在 Swift 3 中也是不同的。因此,如果您打算表示 闭包类型,则后者是合适的没有参数.
这个改动是SE-0029 Remove implicit tuple splat behavior from function applications的一部分,据说在Swift3中实现了,但是好像Swift3还没有完全实现。
在这里,我给你一个简化的检查代码,你可以在 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?()
}
}
}
我在 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 '()'?
}
在 Swift 4 中,元组的处理比以往任何时候都更加严格。
这个闭包类型:(Void)->Void
表示一个闭包
- 接受一个参数,类型为
Void
- returns
Void
,意思是returns没有值
所以,请尝试以下任一方法:
将 Void
类型的值传递给闭包。 (空元组 ()
是 Void
的唯一实例。)
completion?(())
否则:
更改参数类型completion
。
func openAnimation(_ completion: (() -> Void)?) {
//...
}
请记住,(Void)->Void
和 ()->Void
这两种类型即使在 Swift 3 中也是不同的。因此,如果您打算表示 闭包类型,则后者是合适的没有参数.
这个改动是SE-0029 Remove implicit tuple splat behavior from function applications的一部分,据说在Swift3中实现了,但是好像Swift3还没有完全实现。
在这里,我给你一个简化的检查代码,你可以在 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?()
}
}
}