我有一个返回类对象或nil的函数。该功能的目的是检查是否Chat存在。聊天ID存储在MySQL中。如果ID存在,则执行Firebase引用以获取快照,然后获取对象。如果ID不存在,则返回nil:
Chat
func findChat(string: String) -> Chat? { var returnValue: (Chat?) let url = getChatsURL let Parameters = [ "title" : string ] Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in if let anyResponse = response.result.value { self.responseFromServer = anyResponse } if self.responseFromServer == "" { returnValue = nil } else { let ref = DatabaseReference.chats.reference() let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer)) query.observe(.childAdded, with: { snapshot in returnValue = Chat(dictionary: snapshot.value as! [String : Any]) }) } return returnValue } }
但是,在return returnValue我得到
return returnValue
void函数中非预期的非无效返回值。
关于我可能会想念的任何想法?
问题是您试图从一个封闭内部返回一个非空值,该值仅从封闭内部返回,但是由于该封闭期望一个空返回值,因此您会收到错误消息。
您不能使用标准return ...语法从异步函数返回,必须声明函数以接受完成处理程序,并从完成处理程序内部的异步网络调用返回值。
return ...
func findChat(string: String, completion: @escaping (Chat?)->()) { var returnValue: (Chat?) let url = getChatsURL let Parameters = [ "title" : string ] Alamofire.request("\(url)", method: .post, parameters: Parameters).validate().responseString { response in if let anyResponse = response.result.value { self.responseFromServer = anyResponse } if self.responseFromServer == "" { completion(nil) } else { let ref = DatabaseReference.chats.reference() let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: (self.responseFromServer)) query.observe(.childAdded, with: { snapshot in completion(Chat(dictionary: snapshot.value as! [String : Any])) }) } } }
然后,您可以调用此函数并使用如下所示的返回值:
findChat(string: "inputString", completion: { chat in if let chat = chat { //use the return value } else { //handle nil response } })