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),这显然不起作用。所以这是一个逃避闭包的好例子,但我不认为这是他们想要的,他们还说不能用完成来实现逃避功能。。。不管那是什么意思,哈哈。