Ответ на этот мой странный звук звучит странно, но здесь он звучит так: вам лучше всего забыть о responseJSON
, вместо этого использовать responseString
и запустить свой собственный объект протокола Codable
. Последнее можно продемонстрировать на детской площадке следующим образом:
import Cocoa
let jsonData = """
[{
"id": 1,
"name": "",
"eventDate1": "14/02/2018",
"eventDate2": "26/03/2018",
"eventDate3": "01/01/2018"
}]
""".data(using: .utf8)!
struct SpecialEvent: Codable {
let id: Int
let name: String
let eventDate1 : Date
let eventDate2 : Date?
let eventDate3 : Date?
let eventDate4 : Date?
let eventDate5 : Date?
}
let formatter = DateFormatter()
formatter.dateFormat = "dd/mm/yyyy"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
do {
let evt = try decoder.decode([SpecialEvent].self, from: jsonData)
print(evt)
} catch {
print(error)
}
Это значительно упрощает ваш анализ, оставаясь довольно близко к предложенной вами JSON
-структуре. Однако я не уверен, стоит ли хранить ключи eventDate
, это похоже на уродливый кладж. Почему искусственное ограничение на 5 дат? Хорошо, для этого могут быть причины пользовательского интерфейса, но это должно влиять только на ваш дисплей, а не на структуру данных. Если вы можете контролировать отклик своего сервера (и, похоже, можете), вам следует рассмотреть возможность использования массива "dates"
, содержащего только строки или, возможно, другой словарь (например, Codable
объект в Swift) с дополнительной информацией (например, местоположение, время и т. д.) Это будет более гибко, и вам не придется иметь дело с опционами так же, как в текущей структуре.
Обратите внимание, что ваша исходная структура не может быть проанализирована с использованием моей простой структуры данных, поскольку для существующего ключа потребуется действительная дата. Если вы хотите иначе, вам, вероятно, придется написать собственный инициализатор для него.