微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在 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的值传递给闭包. (空元组()是Void的唯一实例.)

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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐