本文介绍了void 函数中出现意外的非 void 返回值.如何从函数返回变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何从函数返回双精度变量?

How do I return a double variable from a function?

class Api {
    func getCoordinates(latitude: Bool) -> Double {
        if (latitude) {
            let url = URL(string: "https://waterservices.usgs.gov/nwis/iv/?format=json&indent=on&sites=08155200&parameterCd=00065&siteStatus=all")!
            URLSession.shared.dataTask(with: url) { data, _, _ in
                if let data = data {
                    let posts = try! JSONDecoder().decode(Post.self, from: data)
                    let lat = (posts.value?.timeSeries?.first?.sourceInfo?.geoLocation?.geogLocation?.latitude)
                    return lat
                }
            }
            print(5)
//            return 5
        } else {
            print(3)
            return 3
        }
    }
}

使用此代码返回:

Unexpected non-void return value in void function

我总是可以删除 return lat 但这会破坏目的.

I could always remove return lat but that would kind of defeat the purpose.

推荐答案

这是一个闭包.Async/await 即将推出,但与此同时,请记住URLSession.shared.dataTask 是一个异步函数.这意味着完成处理程序/闭包将在稍后调用.

It's a closure. Async/await is coming very soon, but in the meantime, remember that URLSession.shared.dataTask is an async function. That means the completion handler/closure will be called at a later time.

因此,您需要添加另一个完成处理程序,而不是 return.

So, instead of return, you'll need to add another completion handler.

class Api {
                                        /// add completion handler
    func getCoordinates(latitude: Bool, completion: @escaping ((Double) -> Void)) {
        if (latitude) {
            let url = URL(string: "https://waterservices.usgs.gov/nwis/iv/?format=json&indent=on&sites=08155200&parameterCd=00065&siteStatus=all")!
            URLSession.shared.dataTask(with: url) { data, _, _ in
                if let data = data {
                    let posts = try! JSONDecoder().decode(Post.self, from: data)
                    let lat = (posts.value?.timeSeries?.first?.sourceInfo?.geoLocation?.geogLocation?.latitude)
                    completion(lat) /// similar to `return lat`
                }
            }
            print(5)
        } else {
            print(3)
            completion(3) /// similar to `return 3`
        }
    }
}

您的旧代码可能如下所示:

Your old code probably looked something like this:

let returnedDouble = Api().getCoordinates(latitude: true)
print(returnedDouble)

现在,将其替换为:

Api().getCoordinates(latitude: true) { returnedDouble in
    print(returnedDouble)
}

这篇关于void 函数中出现意外的非 void 返回值.如何从函数返回变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-24 14:20