Я пишу DateFormatter
dateFormat
для преобразования JSON с сервера в локальный объект swift.Сервер вернет следующее.
- 2018-10-07T15: 26: 33.236Z
- 2018-10-07T15: 26: 33Z
- 2018-10-07T15: 26: 33.26Z
Ниже приведен мой код, но я не уверен, что могу написать только одну строку вместо условий переключения (от SWITCH-CASE START до END).
Идеально подходит только один dateFormat
, независимо от того, имеет ли возвращаемое время миллисекунды или нет.Любой совет приветствуется.
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom{
let container = try $0.singleValueContainer()
let dateStr = try container.decode(String.self)
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .gregorian)
formatter.locale = .current
// *** SWITCH-CASE: START ***
switch dateStr.utf8.count {
case 20:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
case 22:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SZ"
case 23:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSZ"
case 24:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
default:
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
}
// *** SWITCH-CASE: END ***
formatter.timeZone = TimeZone(secondsFromGMT: 0)
return formatter.date(from: dateStr)!
}