Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get data from Firestore and properly append to array

I'm trying to fetch data from Firestore. I've already got the following code but how do I properly append to shelters?

Current error:

Value of type '[String : Any]' has no member 'title'

class FirebaseSession: ObservableObject {

    @Published var shelters: [Shelter] = []

    let ref = Firestore.firestore().collection("shelters")

    getShelters() {
        ref.getDocuments() { (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for document in querySnapshot!.documents {
                    let value = document.data()
                    let shelter = Shelter(id: Int(value.id), title: value.title, image: value.image, availableSpaces: value.available, distance: value.distance, gender: value.gender)
                    self.$shelters.append(shelter)
                }
            }
        }

    }

}
class Shelter {

    var id: Int
    var title: String
    var image: String
    var availableSpaces: Int
    var distance: Double
    var gender: String?

    init?(id: Int, title: String, image: String, availableSpaces: Int, distance: Double, gender: String?) {

        if id < 0 || title.isEmpty || image.isEmpty || availableSpaces < 0 || distance < 0 {
            return nil
        }

        self.id = id
        self.title = title
        self.image = image
        self.availableSpaces = availableSpaces
        self.distance = distance
        self.gender = gender
    }

}

EDIT:

let shelter = Shelter(id: value["id"] as? Int ?? -1, title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Int ?? -1, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "")
like image 561
Tom Avatar asked Apr 21 '26 05:04

Tom


1 Answers

let shelter = Shelter(id: Int(value.id), title: value.title, image: value.image, availableSpaces: value.available, distance: value.distance, gender: value.gender)

Here value is of type [String:Any]. So you cant do value.title . You need to do value["title"] as? String ?? "" and Similarly for id,image,distance,etc.

So the final code becomes:

let shelter = Shelter(id: Int(value["id"], title: value["title"], image: value["image"], availableSpaces: value["available"], distance: value["distance"], gender: value["gender"])

Downcast it accordingly.

UPDATE

replace your code with this

if let shelter = Shelter(id: value["id"] as? Int ?? -1, title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Int ?? -1, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "") { 
   self.shelters.append(shelter)
} else { 
   print("provided data is wrong.")
}
like image 139
iOSArchitect.com Avatar answered Apr 23 '26 00:04

iOSArchitect.com



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!