Я довольно новичок в Firebase / Firestore и в настоящее время пишу приложение iOS / Swift для записи / чтения структуры Customer
в БД. У Клиента есть validTill
типа Date
. В настоящий момент я не могу написать это поле в Firestore, потому что, я полагаю, оно должно быть записано как Timestamp
. Но тогда как я могу продолжать использовать Codable
, все еще имея возможность кодировать Date
в Timestamp
? Использование расширения Codable
действительно удобно, потому что оно позволяет мне делать customer.dictionary
, и все автоматически кодируется и готово к работе, но тогда validTill
не работает. Большинство вопросов / ответов, с которыми я до сих пор сталкивался, касаются «расшифровки» метки времени до даты, которая не является проблемой с кодом, который я написал. Проблема в кодировании.
Есть идеи, как это сделать?
extension Encodable {
var dictionary: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
}
}
public struct Customer: Codable {
public var companyName :String?
public var address :Address
public var contactName :String
public var email :String
public var mobile :String
public var website :String?
public var validTill :Date
public init?(dictionary: [String: Any]) {
guard let address = Address.init(dictionary:(dictionary["address"] as? [String:Any])!),
let contactName = dictionary["contactName"] as? String,
let email = dictionary["email"] as? String,
let mobile = dictionary["mobile"] as? String,
let validTill = dictionary["validTill"] as? Timestamp else {
return nil
}
self.address = address
self.contactName = contactName
self.email = email
self.mobile = mobile
self.companyName = dictionary["companyName"] as? String
self.website = dictionary["website"] as? String
self.validTill = validTill.dateValue()
}
public init?(companyName: String?, address: Address, contactName: String, email: String, mobile: String, website: String?, validTill: Date) {
self.companyName = companyName
self.address = address
self.contactName = contactName
self.email = email
self.mobile = mobile
self.website = website
self.validTill = validTill
}
}