Ваш JSON не требует от вас реализации контейнера без ключа для его анализа образец контейнера без ключа . Что вам нужно, это пользовательские DateFormatter
и DateDecodingStrategy
. Чтобы отсортировать ваши события, вам необходимо согласовать его с Comparable
протоколом
. Это DateFormatter
предполагает, что ваша строка даты имеет фиксированный формат даты с местным временем:
extension Formatter {
static let custom: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMMM d, yyyy h:mm a"
return formatter
}()
}
Пользовательский DateDecodingStrategy
:
extension JSONDecoder.DateDecodingStrategy {
static let monthDayYearTime = custom {
let container = try $0.singleValueContainer()
let string = try container.decode(String.self)
guard let date = Formatter.custom.date(from: string) else {
throw DecodingError.dataCorruptedError(in: container,
debugDescription: "Invalid date: " + string)
}
return date
}
}
Ваш Codable
Структура события:
struct Event: Codable {
let title: String
let start: Date
let end: Date
}
Соответствие Comparable
протоколу
extension Event: Comparable {
static func < (lhs: Event, rhs: Event) -> Bool { lhs.start < rhs.start }
}
Пользовательский description
:
extension Event: CustomStringConvertible {
var description: String {
"Title: \(title) - Start: \(Formatter.custom.string(from: start)) - End: \(Formatter.custom.string(from: end))"
}
}
Тестирование игровой площадки:
Ваша JSON строка:
let json = """
[{"title": "Evening Picnic", "start": "November 10, 2018 6:00 PM", "end": "November 10, 2018 7:00 PM"},
{"title": "Nap Break", "start": "November 8, 2018 12:56 PM", "end": "November 8, 2018 1:30 PM"},
{"title": "Football Game", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]
"""
Расшифровка вашего JSON
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .monthDayYearTime
do {
let events = try decoder.decode([Event].self, from: Data(json.utf8))
print(events.sorted())
} catch {
print(error)
}
Будет напечатано
[Название: Футбольный матч - Начало: 3 ноября 2018 года, 18:14 - Конец: 3 ноября, 2018 9:44 вечера, Название: Перерыв на сон - Начало: 8 ноября 2018 12:56 - Конец: 8 ноября 2018 13:30, Название: Вечерний пикник c - Начало: 10 ноября 2018 г., 6:00 PM - Конец: 10 ноября 2018 г. 19:00]