Я сохраняю и восстанавливаю простую структуру, которая содержит дату.Причиной использования этого формата строки является то, что 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