Почему поддержка Firestore codable не работает для этого примера

#swift #firebase #google-cloud-firestore

#swift #firebase #google-cloud-firestore

Вопрос:

В этом первом примере он компилируется и работает должным образом, возвращая все документы проекта.

 public struct Project: Codable, Identifiable, Equatable {
        
    @DocumentID public var id : String? = UUID().uuidString
    public var name: String
    public var password: String

}
    public static func testQuery() async ->  [Project] {
        let db = Firestore.firestore()
        let ref = db.collection("Project")
        let snapshot = try? await ref.getDocuments()
        if let snapshot = snapshot {
            return snapshot.documents.compactMap { document in
                return try? document.data(as: Project.self)
            }
        } else {
            return [Project]()
        }
    }
 

Однако, если я изменю ссылку, которая будет объявлена как запрос, документы больше не поддерживают codable. Как я могу это исправить, поскольку мне нужно использовать Query для динамического создания запроса на основе переданных параметров.

     public static func testQuery() async ->  [Project] {
        let db = Firestore.firestore()
        let ref: Query = db.collection("Project")  // this line changed
        let snapshot = try? await ref.getDocuments()
        if let snapshot = snapshot {
            return snapshot.documents.compactMap { document in
                return try? document.data(as: Project.self). // this no longer compiles
            }
        } else {
            return [Project]()
        }
    }
 

Комментарии:

1. Откуда взялся специалист по запросам? Проект? Я никогда о нем не слышал.

2. Вы проверили это подробное руководство ?

3. Да, проблема заключается в использовании запроса. Причина, по которой мне нужно объявить ref как запрос, заключается в том, что мне нужно программно .whereField обрабатывать конструкции на основе входных данных, а не знать их во время компиляции. Запрос успешно создается и успешно возвращает документы, однако эти документы по какой-либо причине не поддаются декодированию (кажется, что они должны быть). Возможно, это ошибка в поддержке Firestore Swift

4. Что происходит при переходе let ref: Query = db.collection("Project") на let ref: Query = db.collection("Project").whereField(addSomethingThatYouKnowWillReturnADocument) ? Значит, это работает?

5. к сожалению, та же проблема

Ответ №1:

Оказывается, что если вы приведете ссылку из Query в CollectionReference, вы можете использовать встроенные функции кодирования и декодирования.

 public static func testQuery() async ->  [Project] {
        let db = Firestore.firestore()
        let ref: Query = db.collection("Project")  // this line changed
        let ref2 = ref as! CollectionReference
        let snapshot = try? await ref2.getDocuments()
        if let snapshot = snapshot {
            return snapshot.documents.compactMap { document in
                return try? document.data(as: Project.self). // this no longer compiles
            }
        } else {
            return [Project]()
        }
    }