Swift 我需要从这个函数返回一个值,我有两个参数。我无法完成转义功能

Swift 我需要从这个函数返回一个值,我有两个参数。我无法完成转义功能,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我需要从这个函数返回一个值,我有两个参数。我无法完成转义功能。 如何让它逃跑 func myReturn(str:String,userCU:String)->String{ var res = "" let refU = Database.database().reference(withPath: "users") refU.child(userCU).observeSingleEvent(of:.value) {

我需要从这个函数返回一个值,我有两个参数。我无法完成转义功能。 如何让它逃跑

func myReturn(str:String,userCU:String)->String{
        var res = ""
        let refU = Database.database().reference(withPath: "users")
        refU.child(userCU).observeSingleEvent(of:.value) {
                (snapshot) in

               if snapshot.exists(){
                   // print(snapshot)
                    let dict = snapshot.value as! [String:Any]
                    print(dict)
                    //dict["userCity"]
                    res = dict[str] as! String
                    print(res)


                }
                else {
                    print("noooooo")
            }
        }
       print(res)

         return res
    }

作为起始点,我会考虑在数据库调用失败的情况下返回可选的<代码>字符串< /代码>。< /P>

func getStringAsync(str: String, usr: String, completion: @escaping (String?) -> Void) {

    Database.database().reference(withPath: "users").child(usr).observeSingleEvent(of: .value) { (snapshot) in

        if let snapshot = snapshot,
            let d = snapshot.value as? [String: Any],
            let result = d[str] as? String {
            completion(result)
        } else {
            completion(nil)
        }

    }

}
然后处理可选的
字符串

getStringAsync(str: "abc", usr: "xyz") { (str) in

    if let str = str {
        print(str)
    }

}

您的意思是,您希望从这个函数返回最终结果,因为您不希望有一个完成处理程序,对吗?@K.Wu,是的。我需要返回字符串。这是不可能的。看看
refU.child(userCU).observeSingleEvent(of:.value){…}
,我假设您使用的是firebase SDK
{…}
已经是一个转义的完成处理程序,其返回值为
Void()
,不能从完成处理程序中返回任何与
@escaping
的定义相矛盾的内容作为函数返回值的一部分。如果您不想使用任何第三方库,请使用完成处理程序。您不允许使用转义闭包,或者您不知道如何执行转义闭包?@bsod我不知道我不确定这是否适用于当前的用例。例如,如果应用程序中有三条语句
print(“Start”)
,则“getStringAsynch…”。。。然后
print(“End”)
开始和结束将在str之前打印。或者,我可能误解了如何使用它。
getStringAsync()
必须等待数据库返回,然后才能返回字符串。至于用例,如果OP抽象了一个网络/数据层,比如视图控制器从Firebase获取数据所使用的数据管理器对象(而不是每个视图控制器从自身内部手动获取数据),那么它们都会通过这些转义闭包与该对象进行通信。鉴于这个问题很模糊,看起来他们正试图从Firebase闭包返回数据,就像从同步函数返回字符串一样,并在闭包后继续处理返回的数据。就像我提到的那样,让myName=getStringAsync{…}然后打印(myName),这显然不起作用。所以这是一个逃避闭包的好例子,但我不认为这是他们想要的,他们还说不能用完成来实现逃避功能。。。不管那是什么意思,哈哈。