我通过每个返回语句都会出现一个错误,说" void函数中的意外非流动返回值"。显然这不是一个空白功能,那为什么要说的是呢?当我将返回语句更改为返回void时,它说它正在寻找int。我尝试清洁项目,但没有解决。有什么想法吗?
static public func getBalance(_ balance_label: String) -> Int {
let db = Firestore.firestore()
let userId = Auth.auth().currentUser?.uid ?? ""
let balanceRef = db.collection("account").document(userId).collection("balance")
balanceRef.getDocuments() { (querySnapshot, err) in
if let err = err {
print("Error getting documents: (err)")
return 0
} else {
guard let querySnapshot = querySnapshot else { return 0 }
for document in querySnapshot.documents {
print("document.data() is (document.data())")
guard let label = document.data()["label"] as? String else { continue }
if label == balance_label {
guard let balance = document.data()["balance_amount"] as? Int else { return 0 }
return balance
}
}
return 0
}
}
}
我认为这是因为您的返回语句在第5行中定义的封闭式内部:
balanceRef.getDocuments() { (querySnapshot, err) in ... }
该关闭的签名未指定返回类型,因此,如果我认为,如果您从该关闭内部的返回语句中删除值,然后确保在getDocuments() {}
之后明确返回Int
,则应满足编译器。
getDocuments
是一种异步方法。您不能从异步闭合中进行return
值。您将需要重新分配此操作处理程序模式。
static public func getBalance(_ balance_label: String, completionHandler: @escaping (Int) -> Void) {
let db = Firestore.firestore()
let userId = Auth.auth().currentUser?.uid ?? ""
let balanceRef = db.collection("account").document(userId).collection("balance")
balanceRef.getDocuments { querySnapshot, err in
guard let querySnapshot = querySnapshot, err == nil else {
print("Error getting documents:", err ?? "Unknown error")
completionHandler(0)
return
}
for document in querySnapshot.documents {
print("document.data() is (document.data())")
if let label = document.data()["label"] as? String, label == balance_label {
let balance = document.data()["balance_amount"] as? Int
completionHandler(balance ?? 0)
return
}
}
completionHandler(0)
}
}
然后这样称呼:
Foo.getBalance(label) { value in
// use `value` here
}
// but not here, because the above runs asynchronously
//