Search code examples
swiftstructgoogle-cloud-firestorensarray

Firestore array to swift struct mapping


I've been going round in circles trying to figure out how to map a firebase document to a swift struct. I've got it working well, except I've now added an array within my firebase database and am having zero luck trying to map it to my struct.

Here is my struct:

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
    }
}

Here is my Firestore Database structure:

enter image description here

I get the following error:

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

I know, I know...the error message is quite clear in what I'm doing wrong - but I've gone round in circles so many times I'm hoping someone can point me in the right direction....

Thanks.


Solution

  • Here extendedArray

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

    Is an array not a dictionary , so it should be

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

    Use https://github.com/alickbass/CodableFirebase for easy decoding