我是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
答案 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
将失败