Сохранение объекта с датой по умолчанию для пользователя - дата не будет прежней - PullRequest
0 голосов
/ 12 июня 2019

Я сохраняю и восстанавливаю простую структуру, которая содержит дату.Причиной использования этого формата строки является то, что RESTful API возвращает этот формат даты.Это означает, что это не должно быть изменено для этого примера кода ниже.

extension DateFormatter {

    static let yyyyMMdd: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd"
        return formatter
    }()

}

struct Person: Codable, Equatable {

    let birthDate: Date

    private enum CodingKeys: String, CodingKey {
        case birthDate
    }

}

func storePerson(_ person: Person) {
    let encoder = JSONEncoder()
    encoder.dateEncodingStrategy = .formatted(DateFormatter.yyyyMMdd)
    guard let encodedPerson = try? encoder.encode(person) else {
        return
    }
    UserDefaults.standard.set(encodedPerson, forKey: "savedPerson")
}

func fetchPerson() -> Person {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(DateFormatter.yyyyMMdd)

    guard let savedPerson = UserDefaults.standard.data(forKey: "savedPerson"),
        let person = try? decoder.decode(Person.self, from: savedPerson) else {
            fatalError()
    }

    return person
}

let person = Person(birthDate: Date())
storePerson(person)
let storedPerson = fetchPerson()

print("\(person == storedPerson)") // this will be false
print("\(person.birthDate)")
print("\(storedPerson.birthDate)") // same date as above, but with no minutes

Почему дата не совпадает?Кодер и декодер используют одинаковые dateEncodingStrategy

...