Swift 4:无法将类型((Void)-> Void'的值分配给类型((()-> Void)?)

时间:2018-07-27 09:38:00

标签: swift promisekit

我是Swift-Universe的菜鸟,但我必须使应用程序运行;) 如果您能帮助我找到解决方案,那就太好了。非常感谢。

在升级到较新版本的X-Code(版本9.4.1)和Swift 4之后,就会出现问题。

private var stoppedSuccessfully: (() -> Void)?

func stopRecording() -> Promise<Void> {

    return Promise { success, _ in

        self.stoppedSuccessfully = success // The error occors here: Cannot assign value of type '(Void) -> Void' to type '(() -> Void)?'


        if WCSession.default.isReachable {
            logger.info("Watch is reachable - Send Stop recording message.")
            let command = RecordingCommand.stop

            self.sendMessage(command, EvomoWatchConnectivityCore.WatchConnectivityCoreMethod.transferUserInfo,
                             nil, nil)

            // Create a Timeout
            let timeoutDelay: Double = 15

            DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + timeoutDelay) {

                if self.stoppedSuccessfully != nil {
                    self.logger.warning("### Stopped waiting for Apple Watch recording by Timeout!")
                    success(Void())
                    self.stoppedSuccessfully = nil
                }

            }

            return
        }

        success(Void())
        self.stoppedSuccessfully = nil

    }

}

// In a other part of the code:
self.stoppedSuccessfully?()
self.stoppedSuccessfully = nil

2 个答案:

答案 0 :(得分:1)

首先将stoppedSuccessfully的类型从(() -> Void)?更改为((Void) -> Void)?

private var stoppedSuccessfully: ((Void) -> Void)?

因为,当您使用Promise<T>时,传递给success的闭包类型为(T)->Void。在您的代码中,您使用的是Promise<Void>,因此success的类型是(Void)->Void,而不是()->Void

因此,您的stoppedSuccessfully应该声明为Optional<(Void)->Void>,相当于((Void)->Void)?


要调用类型(Void)->Void的闭包,您需要传递一个类型为Void的参数。有一个Void类型的文字符号,它是(),一个空的元组。

因此,您可以将所有success(Void())替换为简单的success(())

您可以用类似的方式调用stoppedSuccessfully

// In a other part of the code:
self.stoppedSuccessfully?(())

答案 1 :(得分:0)

无需使用Void,只需使用stoppedSuccessfully: ((Void) -> ())?并用

进行调用
 let obj:Void = Void()
 stoppedSuccessfully?(obj) 

我不明白您为什么使用stoppedSuccessfully,它不一定是从success开始分配的nil中分配的,所以不要以为您的条件if self.stoppedSuccessfully != nil将失败