Я хочу декодировать TimeStamp (как определено в FirebaseFirestore.Timestamp в swift) путем анализа ответа из базы данных firestore.
Приведенный ниже код для синтаксического анализа с сервера сообщает мне:
метод экземпляра 'decode (_: forKey :)' требует, чтобы 'Timestamp' соответствовал
на «Декодируемый»
created = try container.decode(FirebaseFirestore.Timestamp.self, forKey: .created)
также я не могу кодировать (сохранить локально или отправить на сервер) со следующей строкой:
try container.encode(created, forKey: .created)
компилятор говорит:
Невозможно преобразовать значение типа Timestamp в ожидаемый тип аргумента.
'Строка'
Полная копия-паста ниже
Кроме того, похоже, что метка времени - это словарь, а не целое число, потому что, когда я пытаюсь декодировать метку времени как целое число, я получаю ошибку:
Expected to decode Int but found a dictionary instead.
но мы все знаем, что [String: Any] (то есть словарь) невозможно декодировать.
import FirebaseFirestore
class SomeClassToParseFromFirestoresDatabase: Codable
{
var created = FirebaseFirestore.Timestamp.init(date: Date())
private enum CodingKeys: String, CodingKey
{
case created
}
func encode(to encoder: Encoder) throws
{
var container = encoder.container(keyedBy: CodingKeys.self)
do
{
try container.encode(created, forKey: .created)
}
catch let error
{
print("error encoding to server or locally: \(error) ")
}
}
required init(from decoder: Decoder) throws
{
let container = try decoder.container(keyedBy: CodingKeys.self)
do
{
created = try container.decode(FirebaseFirestore.Timestamp.self, forKey: .created)
}
catch
{
print("error getting 'created' from server: \(error) ")
}
}
}
Ниже приведен пример того, как проанализировать ответ из функции пожарного хранилища https.callable (которая просто возвращает JSON) - и использовать пользовательский класс ответа для анализа временной отметки в ответе (а также для сохранения временной отметки в классе). )
func getChatUsers( _ done: @escaping (ChatUsersResponse) -> ())
{
let response = ChatUsersResponse()
response.success = true
let functions = Functions.functions()
functions.httpsCallable("getChatUsers").call
{ (result, error) in
if let error = error as NSError?
{
response.success = false
response.message = error.localizedDescription
done(response)
}
else if let result = result,
let data = result.data as? [String:Any],
let users = data["users"]
{
do
{
let nsdata = try JSONSerialization.data(withJSONObject: users, options: .prettyPrinted)
**response.users = try JSONDecoder().decode([SomeClassToParseFromFirestoresDatabase].self, from:nsdata)**
done(response)
}
catch let error
{
response.success = false
response.message = error.localizedDescription
done(response)
return
}
}
else
{
response.success = false
response.message = "Server responded with no error, but no users either"
done(response)
}
}
}