ios - void 函数 Swift3 中出现意外的非 void 返回值

标签 ios 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 处,我得到了

Unexpected non-void return value in void function.

有没有想过我可能会遗漏什么?

最佳答案

问题是您试图从闭包内部返回一个非 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
    }
})

关于ios - void 函数 Swift3 中出现意外的非 void 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925661/

相关文章:

ios - 子框架的 WKWebView

ios - 从文件的NSURL->编辑数据文本,然后转回URL = NULL

ios - 如何使对象 ID 易于阅读?

ios - 使用 API 响应 Swift 填充表

Swift 将成员函数传递给采用可选闭包的函数

swift - 原始类型 'Bool' 不能用任何文字表达

iphone - entityName.state 必须具有已定义的类型

iphone - 将 View 添加到可变数组中

Swift - 手动添加 View 时像 "Push"一样设置动画

ios - Swift - Firebase 如何在没有父项的情况下仅获取子项值