如何停止返回导致“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返回值”?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试 d 时如何导致它停止

关闭模态视图控制器会导致音乐停止

如何找到导致工作人员停止的 .NET 方法

MongoDB出现CPU飚高,如何强制停止正在执行的操作

MySql 查询数据时间过长,导致程序报错 怎么解决

如何停止导致 Firefox 和 Xorg CPU 使用率高的 CSS 动画?