Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无效函数Swift3中意外的非无效返回值_Ios_Swift - Fatal编程技术网

Ios 无效函数Swift3中意外的非无效返回值

Ios 无效函数Swift3中意外的非无效返回值,ios,swift,Ios,Swift,我有一个返回类对象或nil的函数。该功能的目的是检查是否存在聊天。聊天ID存储在MySQL中。如果ID存在,我将执行Firebase引用以获取快照,然后获取对象。如果ID不存在,则返回nil: func findChat(string: String) -> Chat? { var returnValue: (Chat?) let url = getChatsURL let Parameters = [ "title" : string ] Alamof

我有一个返回类对象或nil的函数。该功能的目的是检查是否存在
聊天
。聊天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
    }

}
然而,在
returnValue

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


有没有想到我可能遗漏了什么?

您的块是异步执行的,但您试图从封闭函数返回一个值。这样不行。您的
findChat
函数需要获取一个完成块本身,而不是返回一个值,然后您可以从您试图说
returnreturnvalue
的点调用该完成块。问题是您试图从闭包内返回一个非空值,它只从闭包返回,但是由于闭包需要一个空的返回值,所以您会收到错误

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

类似于。哇!非常感谢你。这个解决方案非常有效。不过,我还需要进一步研究,以了解原因!很高兴我能帮忙。如果您想更多地了解这个主题,请研究异步函数和完成处理程序(如果您非常感兴趣,即使是一般的闭包,完成处理程序实际上也是闭包)。