函数中void函数中意外的非空隙返回值,该函数声明int返回



我通过每个返回语句都会出现一个错误,说" 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
//

最新更新