【问题标题】:Firestore array to swift struct mappingFirestore 数组到 swift 结构映射
【发布时间】:2019-12-16 20:18:12
【问题描述】:

我一直在兜圈子,试图弄清楚如何将 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).

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

谢谢。

【问题讨论】:

  • 如果你知道你添加了一个 array 为什么你要把对象转换成 dictionary?错误信息确实很清楚。

标签: swift struct google-cloud-firestore nsarray


【解决方案1】:

这里extendedArray

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

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

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

使用https://github.com/alickbass/CodableFirebase 轻松解码

【讨论】:

  • 感谢您的回复 - 我已经尝试过您的建议:self.extended = Doc.get("extendedArray") as! [[String: Any]] 但我收到以下错误:Cannot assign value of type '[[String : Any]]' to type 'Contents' 我显然不太了解结构和字典 - 我需要去看看我做错了什么
  • 好的-我已经阅读了一些内容并得出以下结论,如果有错误请大声疾呼!我修改了我的结构如下:var extended : Array<Any> 并删除了struct Contents,因为它似乎没有任何用途。我听从了您上面的建议并执行了以下操作:self.extended = Doc.get("extendedArray") as! [[String: Any]] 这似乎有效,并将 Firestore 数组内容映射到 .extended 允许我根据需要进行访问。
  • 它是var extended :[[String:Any]]
  • 非常感谢Sh_Khan 的帮助,非常感谢。考虑到我们没有将extended 属性分配给类型Contents,我是否认为struct Contents 没有被使用?
【解决方案2】:

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

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,而不是同样取决于数组或字典或任何其他类型。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多