Firestore 数组到 swift 结构的映射

Firestore array to swift struct mapping

我一直在兜圈子试图弄清楚如何将 firebase 文档映射到 swift 结构。我已经让它运行良好,除了我现在在我的 firebase 数据库中添加了一个数组并且尝试将它映射到我的结构时运气为零。

这是我的结构:

import Foundation
import Firebase

struct subData {

    var userID: String
    var topScore: Int
    var extended: Contents

    init(Doc: DocumentSnapshot) {
        self.userID = Doc.get("userID") as? String ?? "nil"
        self.topScore = Doc.get("topScore") as? Int ?? 0
        self.extended = Contents(data: Doc.get("extendedArray") as! [String: Any])!

    }
}

struct Contents {
    var ID00: Int
    var ID01: Int
    var ID02: Int
    var ID03: Int

    init?(data: [String: Any]) {

        guard let ID00 = data["ID00"] as? Int,
            let ID01 = data["ID01"] as? Int,
            let ID02 = data["ID02"] as? Int,
            let ID03 = data["ID03"] as? Int else {
                return nil
        }

        self.ID00 = ID00
        self.ID01 = ID01
        self.ID02 = ID02
        self.ID03 = ID03
    }
}

这是我的 Firestore 数据库结构:

我收到以下错误:

Could not cast value of type '__NSArrayM' (0x1ccc3b660) to 'NSDictionary' (0x1ccc3c628).

我知道,我知道...错误消息很清楚我做错了什么 - 但我已经绕了很多圈我希望有人能指出我正确的方向....

谢谢。

这里extendedArray

self.extended = Contents(data: Doc.get("extendedArray") as! [String: Any])!

是数组不是字典,所以应该是

Doc.get("extendedArray") as! [[String: Any]]

使用https://github.com/alickbass/CodableFirebase方便解码

根据模型,下面的模型是正确的解,

struct subData {

    var userID: String
    var topScore: Int
    var extended:[[String:Any]]

    init(Doc: DocumentSnapshot) {
        self.userID = Doc.get("userID") as? String ?? "nil"
        self.topScore = Doc.get("topScore") as? Int ?? 0
        self.extended = Doc.get("extendedArray") as! [[String: Any]]

    }
}

另请注意,如果 var extended: NSDictionary? 属于字典类型,则应使用 self.extended = Doc.get("extendedArray") as? NSDictionary 而不是明智地依赖于数组或字典或任何其他类型。