【问题标题】:Unexpected non-void return value in void function. How do I return a variable from a function? [duplicate]void 函数中出现意外的非 void 返回值。如何从函数中返回变量? [复制]
【发布时间】:2021-06-12 04:15:16
【问题描述】:

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

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,但这会破坏目的。

【问题讨论】:

  • 查看他们使用URLSession的其他主题。
  • 你不能从一个异步获取其值的函数中返回任何东西(除非你想采用美妙的新asyncawait)。为此,您需要让时间倒流。

标签: ios swift xcode


【解决方案1】:

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

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

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`
        }
    }
}

您的旧代码可能看起来像这样:

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

现在,将其替换为:

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

【讨论】:

  • 也许这是一个愚蠢的问题,但我会在... 中输入什么?
  • @ColinMiller 编辑了我的答案
  • "Async/await 即将到来" 你的意思是像昨天一样? :)
  • @matt(:在我的辩护中,Xcode 13 仍处于测试阶段,并非所有人都可以使用
  • 是的,我不清楚我们甚至可以说什么。
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多