如何停止返回导致“void函数中出现意外的非void返回值”?
Posted
技术标签:
【中文标题】如何停止返回导致“void函数中出现意外的非void返回值”?【英文标题】:How to stop return causing "unexpected non-void return value in void function"? 【发布时间】:2020-07-16 01:36:23 【问题描述】:我正在尝试编写一个从 if 语句返回值的函数。函数如下所示:
func getJson() -> String
if let url = URL(string: "https://api.snow.quirky.codes/cardrona")
URLSession.shared.dataTask(with: url) data, response, error in
if let data = data
let jsonDecoder = JSONDecoder()
do
let parsedJSON = try jsonDecoder.decode(Welcome.self, from: data)
for temp in parsedJSON.todaysTemp
if let mid = temp.mid1640M
return mid
//Causes "unexpected non-void return value in void function" error
catch
print(error)
.resume()
我尝试在 if 语句中设置一个全局变量并将其设置为 mid,但是当我在函数外部打印它时,它只打印“\n”。
【问题讨论】:
This 应该回答你的问题。 【参考方案1】:有两个问题:
完成处理程序是一个非 void 函数,因此您不能从中返回任何内容。您只需将字符串保存在某个全局变量中即可。` 任务在后台执行,这意味着当指令 URLSession.shared.dataTask(...).resume() 完成执行时,这意味着只有后台任务已经开始,这就是为什么你看不到任何东西与打印。 getJson() 函数开始数据下载,但不等待它的结束。数据任务是异步的,它的完成处理程序将稍后执行(如果网络不好,可能需要几秒钟)你使用信号量来处理这个:
您可以在 getJson() 函数的开头添加:
var receivedMid : String = "" let semaphore = DispatchSemaphore(value: 0)
数据任务内部: receivedMid = 中
然后在完成处理程序结束之前添加: 信号量.signal()
然后在 resume() 之后: 信号量.wait() 返回收到中
【讨论】:
以上是关于如何停止返回导致“void函数中出现意外的非void返回值”?的主要内容,如果未能解决你的问题,请参考以下文章