Я бы рекомендовал использовать Codable там, где вы можете. Я использую CodableFirebase
Cocoapod, чтобы помочь с анализом Firebase. Ниже приведен пример, как использовать это:
let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)
docRef.getDocument { (document, error) in
guard let value = document.value, value as? NSNull == nil else {
return
}
do {
let newValue = try self.decoder.decode(User.self, from: value)
///New value created here
} catch let error {
print(error)
}
}
Вы можете сделать это более обобщенным c, пройдя через тип класса и получив необязательный возвращенный экземпляр:
static func item<T: Codable>(_ item: T.Type, docRef: DatabaseReference, completion: @escaping ((Result<T?, Error>)->Void)) {
docRef.getDocument { (document, error) in
guard let value = snapshot.value, value as? NSNull == nil else {
completion(.success(nil))
return
}
do {
let newValue = try self.decoder.decode(T.self, from: value)
completion(.success(newValue))
} catch let error {
completion(.failure(error))
}
}
}