Schaedel420
Schaedel420

Reputation: 175

Swift Firebase cannot store values in dictionary

I am in an impasse.

I have a Data Model for some rating values I want to retrieve and afterwards use for some calculations. The values are stored as strings even if they are numbers between -9 and 9. Casting is not the problem here.

import FirebaseDatabase.FIRDataSnapshot

class AHPPriority {
    
    var key: String?
    
    let creationDate: Date
    let ajkpXc: String
    let ajkpXijr: String
    let ajkpXqpa: String
    let ajkpXcoj: String
    let ajkpXlos: String
    let ajkpXiracc: String
    let ajkpXdph: String
    let cXijr: String
    let cXqpa: String
    let cXcoj: String
    let cXlos: String
    let cXiracc: String
    let cXdph: String
    let ijrXqpa: String
    let ijrXcoj: String
    let ijrXlos: String
    let ijrXiracc: String
    let ijrXdph: String
    let qpaXcoj: String
    let qpaXlos: String
    let qpaXiracc: String
    let qpaXdph: String
    let cojXlos: String
    let cojXiracc: String
    let cojXdph: String
    let losXiracc: String
    let losXdph: String
    let iraccXdph: String

    
    init(ajkpXc: String, ajkpXijr: String, ajkpXqpa: String, ajkpXcoj: String, ajkpXlos: String, ajkpXiracc: String, ajkpXdph: String, cXijr: String, cXqpa: String, cXcoj: String, cXlos: String, cXiracc: String, cXdph: String, ijrXqpa: String, ijrXcoj: String, ijrXlos: String, ijrXiracc: String, ijrXdph: String, qpaXcoj: String,  qpaXlos: String,   qpaXiracc: String,  qpaXdph: String, cojXlos: String, cojXiracc: String, cojXdph: String, losXiracc: String, losXdph: String, iraccXdph: String) {
        
                self.creationDate = Date()
                self.ajkpXc = ajkpXc
                self.ajkpXijr = ajkpXijr
                self.ajkpXqpa = ajkpXqpa
                self.ajkpXcoj = ajkpXcoj
                self.ajkpXlos = ajkpXlos
                self.ajkpXiracc = ajkpXiracc
                self.ajkpXdph = ajkpXdph
                self.cXijr = cXijr
                self.cXqpa = cXqpa
                self.cXcoj = cXcoj
                self.cXlos = cXlos
                self.cXiracc = cXiracc
                self.cXdph = cXdph
                self.ijrXqpa = ijrXqpa
                self.ijrXcoj = ijrXcoj
                self.ijrXlos = ijrXlos
                self.ijrXiracc = ijrXiracc
                self.ijrXdph =  ijrXdph
                self.qpaXcoj = qpaXcoj
                self.qpaXlos = qpaXlos
                self.qpaXiracc = qpaXiracc
                self.qpaXdph = qpaXdph
                self.cojXlos = cojXlos
                self.cojXiracc = cojXiracc
                self.cojXdph = cojXdph
                self.losXiracc = losXiracc
                self.losXdph = losXdph
                self.iraccXdph = iraccXdph
        
        
    }

    var dictValue: [String: Any] {
   let createdAgo = creationDate.timeIntervalSince1970
    
        return ["created_at" : createdAgo,
        "ajkpXc": ajkpXc,
        "ajkpXijr ": ajkpXijr,
        "ajkpXqpa": ajkpXqpa,
        "ajkpXcoj": ajkpXcoj,
        "ajkpXlos ": ajkpXlos,
        "ajkpXiracc ": ajkpXiracc,
        "ajkpXdph": ajkpXdph,
        "cXijr": cXijr,
        "cXqpa": cXqpa,
        "cXcoj": cXcoj,
        "cXlos": cXlos,
        "cXiracc": cXiracc,
        "cXdph": cXdph,
        "ijrXqpa": ijrXqpa,
        "ijrXcoj": ijrXcoj,
        "ijrXlos": ijrXlos,
        "ijrXiracc": ijrXiracc,
        "ijrXdph": ijrXdph,
        "qpaXcoj": qpaXcoj,
        "qpaXlos": qpaXlos,
        "qpaXiracc": qpaXiracc,
        "qpaXdph": qpaXdph,
        "cojXlos": cojXlos,
        "cojXiracc": cojXiracc,
        "cojXdph": cojXdph,
        "losXiracc": losXiracc,
        "losXdph": losXdph,
        "iraccXdph": iraccXdph ]
     
}
    
    init?(snapshot: DataSnapshot) {
    guard let dict = snapshot.value as? [String: Any],
    
    let createdAgo = dict["created_at"] as? TimeInterval,
    let ajkpXc = dict["ajkpXc"] as? String,
    let ajkpXijr = dict["ajkpXijr"] as? String,
    let ajkpXqpa = dict["ajkpXqpa"] as? String,
    let ajkpXcoj = dict["ajkpXcoj"] as? String,
    let ajkpXlos = dict["ajkpXlos"] as? String,
    let ajkpXiracc = dict["ajkpXiracc"] as? String,
    let ajkpXdph = dict["ajkpXdph"] as? String,
    let cXijr = dict["cXijr"] as? String,
    let cXqpa = dict["cXqpa"] as? String,
    let cXcoj = dict["cXcoj"] as? String,
    let cXlos = dict["cXlos"] as? String,
    let cXiracc = dict["cXiracc"] as? String,
    let cXdph = dict["cXdph"] as? String,
    let ijrXqpa = dict["ijrXqpa"] as? String,
    let ijrXcoj = dict["ijrXcoj"] as? String,
    let ijrXlos = dict["ijrXlos"] as? String,
    let ijrXiracc = dict["ijrXiracc"] as? String,
    let ijrXdph = dict["ijrXdph"] as? String,
    let qpaXcoj = dict["qpaXcoj"] as? String,
    let qpaXlos = dict["qpaXlos"] as? String,
    let qpaXiracc = dict["qpaXiracc"] as? String,
    let qpaXdph = dict["qpaXdph"] as? String,
    let cojXlos = dict["cojXlos"] as? String,
    let cojXiracc = dict["cojXiracc"] as? String,
    let cojXdph = dict["cojXdph"] as? String,
    let losXiracc = dict["losXiracc"] as? String,
    let losXdph = dict["losXdph"] as? String,
    let iraccXdph = dict["iraccXdph"] as? String

     else {return nil}
        
        
        self.key = snapshot.key
        self.creationDate = Date(timeIntervalSince1970: createdAgo)
        self.ajkpXc = ajkpXc
        self.ajkpXijr = ajkpXijr
        self.ajkpXqpa = ajkpXqpa
        self.ajkpXcoj = ajkpXcoj
        self.ajkpXlos = ajkpXlos
        self.ajkpXiracc = ajkpXiracc
        self.ajkpXdph = ajkpXdph
        self.cXijr = cXijr
        self.cXqpa = cXqpa
        self.cXcoj = cXcoj
        self.cXlos = cXlos
        self.cXiracc = cXiracc
        self.cXdph =  cXdph
        self.ijrXqpa = ijrXqpa
        self.ijrXcoj = ijrXcoj
        self.ijrXlos = ijrXlos
        self.ijrXiracc =  ijrXiracc
        self.ijrXdph =  ijrXdph
        self.qpaXcoj = qpaXcoj
        self.qpaXlos = qpaXlos
        self.qpaXiracc =   qpaXiracc
        self.qpaXdph = qpaXdph
        self.cojXlos = cojXlos
        self.cojXiracc = cojXiracc
        self.cojXdph = cojXdph
        self.losXiracc =   losXiracc
        self.losXdph = losXdph
        self.iraccXdph = iraccXdph
        }

}

I actually can retrieve the Data properly using following Service:

struct UserService {
    static func ahpPref(for user: User, completion: @escaping ([AHPPriority]) -> Void) {
           let ref = Database.database().reference().child("AHPRatings").child(user.uid)
        
        ref.observe(DataEventType.value, with: { (snapshot) in
                   guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
                       return completion([])
                   }

                   let ahpPrios = snapshot.reversed().compactMap(AHPPriority.init)
                   completion(ahpPrios)
                print( ahpPrios)
            for ahpPrio in ahpPrios {
                print(ahpPrio)
            }
               })

        
     
    }
}

The weird thing is, snapshot contains all the values. But ahpPrios is empty. And I don't know why.

Can anyone help me? :)

Upvotes: 1

Views: 42

Answers (1)

Frankenstein
Frankenstein

Reputation: 16341

You're using a failable initializer (init?) for AHPPriority, combined with compactMap which will return empty array if all the initializers failed. To fix this, you'll have to modify the init?(snapshot: DataSnapshot) method completely. Check each value for which is returning nil and instead of failing the initialization maybe provide a default value or make just that property to be optional. Example if created_at is returned as nil and init is completely failing because of it then make creationDate optional let creationDate: Date?. Remove the guard let enclosing everything and do a fail safe guard let according to your requirement.

Better approach would be to use Codable.

Upvotes: 1

Related Questions