Reputation: 175
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
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