Firebase Firestore: Кодировщик из пользовательских структур не работает

# #swift #google-cloud-firestore

Вопрос:

Поэтому я создал функцию, в которой я пытаюсь создать документ в своем Firestore, в котором хранятся пользовательские данные. Но при обновлении моего проекта до бета-версии Xcode 13.0 кодировщик Firebase перестал работать. Кто-нибудь еще сталкивался с подобной проблемой?

Моя модель выглядит так:

 struct User: Identifiable, Codable {
    
    @DocumentID var id: String?
    
    var auth_id: String?
    var username: String
    var email: String

    enum CodingKeys: String, CodingKey {
        case auth_id
        case username
        case email
    }
    
}
 

И звонок на Огневую базу вот так:

 let newUser = User(auth_id: idToken, username: name, email: email)
            
try await databasemodel.database.collection("users").document(idToken).setData(newUser)
 

Документ, созданный с помощью этого кода, еще не существует, но он работал раньше.
Теперь, когда я компилирую, я получаю ошибку: «Не удается преобразовать значение типа»Пользователь» в ожидаемый тип аргумента » [Строка : Любая]»»
Никаких других ошибок не отображается, и я почти уверен, что остальная часть кода работает так, как ожидалось.

Ответ №1:

Поэтому я столкнулся с аналогичной проблемой с кодируемыми файлами… Я сделал это небольшое расширение, которое спасло меня. Может быть, это сработает и для вас тоже 🙂

 extension Encodable {
    /// Convenience function for object which adheres to Codable to compile the JSON
    func compile () -> [String:Any] {
        guard let data = try? JSONEncoder().encode(self) else {
            print("Couldn't encode the given object")
            preconditionFailure("Couldn't encode the given object")
        }
        return (try? JSONSerialization
            .jsonObject(with: data, options: .allowFragments))
            .flatMap { $0 as? [String: Any] }!
    }
}
 

Затем вы можете сделать

 try await databasemodel.database.collection("users").document(idToken).setData(newUser.compile())
 

Примечание. Я этого не проверял. Я просто предоставляю расширение, которое решило мою проблему, когда я столкнулся с тем же самым.

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

1. Хорошо, я наконец-то собрался это проверить, но у меня проблема со значением @documentId. Я хочу использовать его в качестве имени документа, но кодировщик JSON этого не позволяет, я получаю ошибку «Кодирование не поддерживается»…