【问题标题】:Why i am getting "Unexpected non-void return value in void function" error while returning value in swift? [duplicate]为什么我在快速返回值时收到“无效函数中的意外非无效返回值”错误? [复制]
【发布时间】:2021-02-16 07:18:47
【问题描述】:

虽然我在函数中提供了返回类型,但我收到错误“在 void 函数中出现意外的非 void 返回值”。

以下是我的参考代码:

func getLatDestination() -> Double {
    var params = [String: Any]()
    params[ParametersKeys.access_token] = KeyChain.getAccessToken()!
    params[ParametersKeys.address] = googlePlaceObject?.results.first?.formattedAddress
    params[ParametersKeys.latitude] = googlePlaceObject?.results.first?.geometry.location.lat
    params[ParametersKeys.longitude] = googlePlaceObject?.results.first?.geometry.location.lng
    params[ParametersKeys.googlePlaceId] = googlePlaceObject?.results.last?.placeId
    params[ParametersKeys.login_type] = 1
        
    AuthManager.shared.saveAddressAsWorkHome(params) { (response) in
        if response.flag == RESPONSE_FLAGS.flag_143 {
            if let addressData = response.response["addresses"] as? [[String: Any]] {
                return  addressData[0]["lat"]
            }
        }
    }
}

我在控制台中将addressData[0]["lat"] 的值设为Optional(51.5050755)

如果这是一个非常基本的问题,请原谅我,因为我是 swift 的初学者。

【问题讨论】:

    标签: swift function void return-type


    【解决方案1】:

    我认为AuthManager.shared.saveAddressAsWorkHome(params) { (response) in 这是asynchronous 闭包,您尝试在其中返回一个值,因此您收到此错误。

    你不能直接从异步函数返回。您必须在方法上添加完成处理程序并在完成处理程序中从异步返回值

    所以你必须改变你的功能

    func getLatDestination(completion : @escaping (Double) -> ()){
    var params = [String: Any]()
    params[ParametersKeys.access_token] = KeyChain.getAccessToken()!
    params[ParametersKeys.address] = googlePlaceObject?.results.first?.formattedAddress
    params[ParametersKeys.latitude] = googlePlaceObject?.results.first?.geometry.location.lat
    params[ParametersKeys.longitude] = googlePlaceObject?.results.first?.geometry.location.lng
    params[ParametersKeys.googlePlaceId] = googlePlaceObject?.results.last?.placeId
    params[ParametersKeys.login_type] = 1
        
    AuthManager.shared.saveAddressAsWorkHome(params) { (response) in
        if response.flag == RESPONSE_FLAGS.flag_143 {
            if let addressData = response.response["addresses"] as? [[String: Any]] {
                        completion(addressData[0]["lat"])
    
            }
        }
    }
    

    当你调用你的函数时

    getLatDestination(completion: {ret in
            print(ret) 
        })
    

    【讨论】:

      【解决方案2】:

      你不能做你想做的事。函数saveAddressAsWorkHome() 是异步的。当您调用它时,它会在结果可用之前立即返回。在未来某个时间,保存完成并执行您的完成处理程序代码。

      您不能从完成处理程序中的函数返回。

      您需要重构 getLatDestination() 函数以获取完成处理程序,并在结果可用时调用它。

      您应该阅读 Swift 中的异步函数和完成处理程序。

      重写后的函数可能如下所示:

      func getLatDestination(completion: @escaping (Double?)->())  {
          var params = [String: Any]()
          params[ParametersKeys.access_token] = KeyChain.getAccessToken()!
          params[ParametersKeys.address] = googlePlaceObject?.results.first?.formattedAddress
          params[ParametersKeys.latitude] = googlePlaceObject?.results.first?.geometry.location.lat
          params[ParametersKeys.longitude] = googlePlaceObject?.results.first?.geometry.location.lng
          params[ParametersKeys.googlePlaceId] = googlePlaceObject?.results.last?.placeId
          params[ParametersKeys.login_type] = 1
              
          AuthManager.shared.saveAddressAsWorkHome(params) { (response) in
              if response.flag == RESPONSE_FLAGS.flag_143 {
                  if let addressData = response.response["addresses"] as? [[String: Any]] {
                      completion(addressData[0]["lat"] as? Double)
                  }
              }
              else { completion(nil) }
          }
      }
      

      函数`getLatDestination() 现在接受一个完成处理程序,一个代码块。反过来,该完成处理程序采用 Optional Double 作为结果。 (看起来你的异步函数返回了一个字典,你不能确定它是否包含你期望的键/值和类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2021-07-15
        • 2020-04-10
        • 2014-07-14
        • 2017-10-10
        相关资源
        最近更新 更多