void函数Swift3中的意外非void返回值

Posted

技术标签:

【中文标题】void函数Swift3中的意外非void返回值【英文标题】:Unexpected non-void return value in void function Swift3 【发布时间】:2017-08-28 18:57:37 【问题描述】:

我有一个返回类对象或 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 返回值。

对我可能缺少什么有什么想法吗?

【问题讨论】:

类似于this issue。 【参考方案1】:

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

【讨论】:

哇!非常感谢你。该解决方案完美运行。不过,我需要进一步研究才能理解为什么! 很高兴我能帮上忙。如果您想了解有关该主题的更多信息,请查看异步函数和完成处理程序(如果您真的很热衷,即使是一般的闭包,完成处理程序实际上也是闭包)。【参考方案2】:

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

【讨论】:

以上是关于void函数Swift3中的意外非void返回值的主要内容,如果未能解决你的问题,请参考以下文章

void函数Swift 4中的意外非void返回值

类理解:void函数中出现意外的非void返回值(swift 3)

Swift 3:无法调用非函数类型“(()-> Void)的值?”

如何停止返回导致“void函数中出现意外的非void返回值”?

Swift 1.2:void 函数中出现意外的非 void 返回值

新 Swift 类的 void 函数中出现意外的非 void 返回值