为什么我在 swift 中返回值时出现 "Unexpected non-void return value in void function" 错误?

Why i am getting "Unexpected non-void return value in void function" error while returning value in swift?

尽管我在函数中提供了 return 类型,但我收到错误“无效函数中的意外非无效 return 值”。

以下是我的代码供参考:

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。

我认为 AuthManager.shared.saveAddressAsWorkHome(params) { (response) in 这是 asynchronous 闭包,你试图 return 一个值,所以你得到这个错误。

您不能 return 直接从异步函数。您必须在您的方法上添加一个完成处理程序,并且 return 完成处理程序中异步的值

所以你必须改变你的功能

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

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

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

您需要重构 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 作为结果。 (看起来你的异步函数 return 是一个字典,你不能确定它会包含你期望的 key/values 和类型。