Как написать структуру Swift Codable со свойством Date в Firestore - PullRequest
0 голосов
/ 24 мая 2019

Я довольно новичок в 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
    }
}

...