Swift 函数返回空数据

App*_*Guy 1 swift

我是 Swift 编码的新手,我一直在寻找解决此问题的方法已有一段时间,但目前还没有找到任何可以解决我的问题的方法。

我正在使用一个函数从 Firebase 返回一些数据。经过多次错误和大量研究,我设法使函数“工作”而不会引发错误,但返回的数据是空白的。本质上,当我调用函数时,我试图返回多个值并将它们保存在一个数组中。

数据从 Firebase 返回得很好,当我在设置变量后打印出变量时,它会正确打印出来,但是当我在返回函数之前执行相同操作时,它返回空白。如果我尝试在设置数据后立即返回该函数,则会收到错误“void 函数中出现意外的非空返回值”。

这是完整的代码:

func loadClientData(client_id: String) -> (address_1: String, address_2: String, city: String, company_name: String, contact_name: String, county: String, email: String, phone: String, postcode: String, country: String) {
        let db = Firestore.firestore()
        let userID : String = (Auth.auth().currentUser!.uid)

        print("\(userID)/clients/existing/\(client_id)")

        let docRef = db.collection("\(userID)/clients/existing/").document(client_id)

        var address_1 = ""
        var address_2 = ""
        var city = ""
        var company_name = ""
        var contact_name = ""
        var county = ""
        var email = ""
        var phone = ""
        var postcode = ""
        var country = ""

        docRef.getDocument { (document, error) in
            if let document = document, document.exists {

                let data = document.data()

                address_1 = data?["address_1"] as? String ?? ""
                address_2 = data?["address_2"] as? String ?? ""
                city = data?["city"] as? String ?? ""
                company_name = data?["company_name"] as? String ?? ""
                contact_name = data?["contact_name"] as? String ?? ""
                county = data?["county"] as? String ?? ""
                email = data?["email"] as? String ?? ""
                phone = data?["phone"] as? String ?? ""
                postcode = data?["postcode"] as? String ?? ""
                country = data?["country"] as? String ?? ""

                print("Company name is \(company_name)") // <---- THIS prints out the company name

            } else {
                print("client does not exist")
                return
            }
        }


        print("Company name is \(company_name)") // <---- THIS prints the company name as blank

        return (address_1: address_1, address_2: address_2, city: city, company_name: company_name, contact_name: contact_name, county: county, email: email, phone: phone, postcode: postcode, country: country)
    }
Run Code Online (Sandbox Code Playgroud)

这被称为这样:

let companyInfo = loadClientData(client_id: self.items[indexPath.item].company)

        print(companyInfo)
Run Code Online (Sandbox Code Playgroud)

并打印出以下内容:

(address_1: "", address_2: "", city: "", company_name: "", contact_name: "", 县: "", email: "", phone: "", postcode: "", country: "" )

预先感谢您的意见。

Dan*_*iel 5

这个网站上有很多问题与你的基本相同,你应该看看它们。为避免冗余,我将用简单的术语进行解释,但我敦促您阅读类似的问题。

简而言之,发生的事情是异步loadClientData获取数据,这意味着它发生在后台,而其他事情发生在前台。前台的东西包括调用和打印出来的代码。前景的东西不会等待背景的东西完成。loadClientData

您什么也没得到,因为到您print(companyInfo).

现实世界的例子:

你妈妈让你去买一个柠檬来做她晚餐做的一道菜。

她开始做饭,但她没有柠檬!

为什么?因为你还没从超市回来,你妈也没等。

如果你想让前台的东西等待,你有很多选择,你可以通过查看其他类似问题来考虑。