Получить данные из Firestore и правильно добавить в массив - PullRequest
3 голосов
/ 13 января 2020

Я пытаюсь получить данные из Firestore. Я уже получил следующий код, но как правильно добавить к shelters?

Текущая ошибка:

Значение типа '[String: Any]' не имеет члена '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
    }

}

РЕДАКТИРОВАТЬ :

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 ?? "")

1 Ответ

2 голосов
/ 13 января 2020
let shelter = Shelter(id: Int(value.id), title: value.title, image: value.image, availableSpaces: value.available, distance: value.distance, gender: value.gender)

Здесь value имеет тип [String:Any]. Так что вы не можете сделать value.title. Вам нужно сделать value["title"] as? String ?? "" и аналогично для идентификатора, изображения, расстояния и т. Д. c.

Таким образом, окончательный код становится:

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

Уменьшить его соответственно.

ОБНОВЛЕНИЕ

замените ваш код этим

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.")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...