【问题标题】:Swift: Unable to append struct instance to arraySwift:无法将结构实例附加到数组
【发布时间】:2020-04-12 22:05:13
【问题描述】:

我在从 Firestore 创建临时用户数据数组时遇到了一些问题。基本上,我创建了一个函数,它从 Firestore 集合中检索用户数据,然后遍历该集合中的每个文档,为每个文档创建一个“思想”结构的实例。然后我将每个“Thought”实例附加到一个名为“tempThoughts”的临时数组中,然后该函数返回该数组。问题是函数中的数组似乎没有附加任何内容。当我通过在完成后打印出数组的内容来测试它时,它只打印一个空数组。

数据本身是从 Firestore 集合中读取的,因为它会打印出函数迭代的每个文档,所以我认为这不是问题所在。我还尝试通过打印出来来检查我是否真的在正确地创建“Thought”结构的实例,这似乎是有效的。有谁知道我将结构实例附加到数组的方式有什么问题?也许有更好的方法来做到这一点?感谢您提前提供任何帮助。

这是我目前的功能:

func getUserDocuments() -> [Thought]{
var tempThoughts = [Thought]()
db.collection(cUser!.uid).getDocuments() { (querySnapshot, err) in
    if let err = err {
        print("Error getting documents: \(err)")
    } else {
        for document in querySnapshot!.documents {
            print("\(document.documentID) => \(document.data())")
            let tempThought: Thought = Thought(id: document.get("id") as! String, content: document.get("content") as! String, dateCreated: document.get("timestamp") as! String, isFavorite: (document.get("isFavorite") != nil))

            tempThoughts.append(tempThought)
        }
    }
}
print("TEST")
print(tempThoughts)
return tempThoughts

}

【问题讨论】:

    标签: arrays swift struct google-cloud-firestore append


    【解决方案1】:

    您的 getDocuments 是异步操作。并且您仅在完成时更新了您的 tempThoughts。但是您打印出来的地方将在 getDocuments 完成之前执行。查看控制台中记录的结果顺序。

    【讨论】:

    • 是的,就是这样。我尝试在操作的 else {} 部分将其打印出来,但数组实际上并不为空。谢谢!
    • 如果您觉得有帮助,您可以接受答案。干杯。
    【解决方案2】:

    你需要像这样更新你的代码

        func getUserDocuments(_ onSuccess: ((_ thoughts: [Thought] ) -> Void), onFailuer: ((_ error: String) -> Void)) {
    
        var tempThoughts = [Thought]()
        db.collection(cUser!.uid).getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
                onFailuer(err)
            } else {
                DispatchQueue.main.async {
                    for document in querySnapshot!.documents {
                        print("\(document.documentID) => \(document.data())")
                        let tempThought: Thought = Thought(id: document.get("id") as! String, content: document.get("content") as! String, dateCreated: document.get("timestamp") as! String, isFavorite: (document.get("isFavorite") != nil))
    
                        tempThoughts.append(tempThought)
                    }
                    print("TEST")
                    print(tempThoughts)
                    onSuccess(tempThoughts)
                }
            }
        }
    }
    

    使用此代码

    你可以像这样使用这个功能

        getUserDocuments({ (thoughts) in
            // Your logic
        }) { (error) in
            // error Occured
        }
    

    【讨论】:

    • 我尝试了这段代码,xCode 在每个返回语句中都抱怨“void 函数中出现意外的非 void 返回值”。知道为什么吗?
    • @sammcode 我已经更新了我的代码。因为您的代码也可能包含错误,所以您也需要检查错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多