void函数Swift3

时间:2017-08-28 18:57:37

标签: swift

我有一个返回类对象或nil的函数。该功能的目的是检查是否存在Chat。聊天ID存储在MySQL中。如果ID存在,我执行Firebase引用以获取快照,然后获取该对象。如果ID不存在,我返回nil:

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我正在

  

void函数中出现意外的非void返回值。

对我可能遗失的任何想法?

2 个答案:

答案 0 :(得分:8)

问题是你试图从闭包内部返回一个非void值,它只从闭包返回,但由于该闭包需要一个void返回值,你会收到错误。

您不能使用标准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
    }
})

答案 1 :(得分:3)

您的块是异步执行的,但您正在尝试从封闭函数返回一个值。它不会那样工作。您的findChat函数需要自己获取完成块而不是返回值,然后您可以从您尝试说return returnValue的位置调用该完成块。