当前位置: 首页 > 面试题库 >

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

甄成弘
2023-03-14
问题内容

我有一个返回类对象或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函数中非预期的非无效返回值。

关于我可能会想念的任何想法?


问题答案:

问题是您试图从一个封闭内部返回一个非空值,该值仅从封闭内部返回,但是由于该封闭期望一个空返回值,因此您会收到错误消息。

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


 类似资料:
  • 问题内容: 我刚刚开始学习面向对象,并且已经开始编写一个用户类,该类具有一种计算用户到对象的距离的方法。看起来像这样: 在上面标记的行上,出现以下错误: 我在其他地方寻找解决方案,但似乎找不到适用于此实例的任何东西。我在其他地方使用过distanceFromLocation代码,效果还不错,所以我不确定在这种情况下用法有什么不同。 谢谢你的帮助! 问题答案: 您在方法标头中缺少返回类型。 看来我的

  • 问题内容: 我创建了一个从API获取URL并返回URL字符串作为结果的函数。但是,Xcode给我此错误消息: void函数中非预期的非无效返回值 有谁知道为什么会这样吗? 问题答案: 使用闭包而不是返回值:

  • C和C中有没有办法让返回void的函数按照未指定的顺序求值? 我知道函数参数是按未指定的顺序计算的,因此对于不返回void的函数,这可用于以未指定的顺序计算这些函数: 合格编译器编译的合法C和C代码可以按任何顺序打印< code>hi 、< code>bye和< code>moo。这并不是未定义的行为(鼻魔是无效的),有效的输出不止一个,但不一定是无限的,一个兼容的编译器甚至不需要确定它产生了什么

  • 我正在学习指针是如何工作的,但我不明白这段代码中的一件事。在void*函数中返回int就像一个咒语,但是返回float就不是了。

  • 这是我的代码行,我得到一条警告:“函数返回non void时没有返回语句警告”,我将total声明为:static int total; 有什么建议我如何摆脱警告?

  • 我在玩C语言中的函数指针只是为了学习。我尝试调用一个空函数,并将其结果设置为int。 我从中得到的结果是: 在对它进行了一点研究之后,我意识到main正在函数()中打印printf语句中的字符数。为什么会这样?这是预期产出吗?