首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将带有对象的Fi还原数组解压缩为模型

将带有对象的Fi还原数组解压缩为模型
EN

Stack Overflow用户
提问于 2021-05-16 16:09:07
回答 1查看 155关注 0票数 0

我有一个用于数据库的Firestore项目。我的用户防火墙数据集如下所示。包含对象的数组的用户详细信息。

我有一个函数,它可以获取具有所有防火墙数据的特定用户:

代码语言:javascript
复制
func fetchUser(){
    
    db.collection("users").document(currentUser!.uid)
        .getDocument { (snapshot, error ) in
            do {
                if let document = snapshot {
                    
                    let id = document.documentID
                    let firstName = document.get("firstName") as? String ?? ""
                    let secondName = document.get("secondName") as? String ?? ""
                    let imageUrl = document.get("imageUrl") as? String ?? ""
                    let joinedDate = document.get("joinedDate") as? String ?? ""
                    let coins = document.get("coins") as? Int ?? 0
                    let challenges = document.get("activeChallenges") as? [Challenge] ?? []
                    
                    let imageLink = URL(string: imageUrl)
                    
                    let imageData = try? Data(contentsOf: imageLink!)
                    
                    let image = UIImage(data: imageData!) as UIImage?
                    
                    let arrayWithNoOptionals = document.get("activeChallenges").flatMap { $0 }
                    print("array without opt", arrayWithNoOptionals)
                    
                    self.user = Account(id: id, firstName: firstName, secondName: secondName, email: "", password: "", profileImage: image ?? UIImage(), joinedDate: joinedDate, coins: coins, activeChallenges: challenges)
                }
                else {
                    print("Document does not exist")
                    
                }
            }
            catch {
                fatalError()
            }
        }
}

这就是用户模型的样子:

代码语言:javascript
复制
class Account {
var id: String?
var firstName: String?
var secondName: String?
var email: String?
var password: String?
var profileImage: UIImage?
var coins: Int?
var joinedDate: String?
var activeChallenges: [Challenge]?


init(id: String, firstName: String,secondName: String, email: String, password: String, profileImage: UIImage, joinedDate: String, coins: Int, activeChallenges: [Challenge]) {
    self.id = id
    self.firstName = firstName
    self.secondName = secondName
    self.email = email
    self.password = password
    self.profileImage = profileImage
    self.joinedDate = joinedDate
    self.coins = coins
    self.activeChallenges = activeChallenges
}

init() {
    
}

}

问题是,我不知道如何将activeChallenges从防火墙映射到模型的数组。当我尝试:let challenges = document.get("activeChallenges") as? [Challenge] ?? []时,打印包含一个空数组,但当我这样做时:let arrayWithNoOptionals = document.get("activeChallenges").flatMap { $0 } print("array without opt", arrayWithNoOptionals)

这是平面映射的输出:它返回一个可选数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-16 16:57:40

系统不能确定activeChallenges是挑战对象的数组。因此,您需要先将其转换为键值类型(Dictionary),然后将其映射到挑战性对象。

代码语言:javascript
复制
let challengesDict = document.get("activeChallenges") as? [Dictionary<String: Any>] ?? [[:]]
let challenges = challengesDict.map { challengeDict in
    let challenge = Challenge()
    challenge.challengeId = challengeDict["challengeId"] as? String
    ...
    return challenge
}

这与将快照(文档)转换为Account对象的方式相同。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67558899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档