为什么我在 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 和类型。
尽管我在函数中提供了 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 和类型。