# #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 этого не позволяет, я получаю ошибку «Кодирование не поддерживается»…