Search code examples
swiftfunctionvoidreturn-type

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


I am getting the error "Unexpected non-void return value in void function", although I am providing return type in the function.

Following is my code for reference:

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"]
            }
        }
    }
}

and I am getting value of addressData[0]["lat"] as Optional(51.5050755) in console.

Pardon me if it is very basic question as I am beginner to swift.


Solution

  • I think AuthManager.shared.saveAddressAsWorkHome(params) { (response) in this is asynchronous closure and you are try to return a value in it so you getting this error.

    You can not return from asynchronous function directly. You have to add a completion handler on your method and return the value from async in completion handler

    So you have to change your function

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

    And when you call your function

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