我們定義一個 time 類型爲 Date
例如:
struct SessionTime: Codable {
let sessionStartTime: Date?
let sessionEndTime: Date?
let newSessionStartTime: Date?
let newSessionEndTime: Date?
}
並且在解析的時候,後端返回我們的都是 ISO8601 類型,這個時候,我們只需要定義一下 decoder 一下就可以:
lazy var jsonDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .iso8601
return decoder
}()
然而,這些Date有可能偶爾沒有值,這個之後如果後端返回給我們 “”的話,用 jsonDecoder 解析時就會報錯:Expected date string to be ISO8601-formatted
後端返回:
"session_start_time" : "2019-12-03T16:00:00+00:00",
"session_end_time" : "2019-12-03T17:00:00+00:00",
"new_session_start_time": "",
"new_session_end_time" : "",
解決辦法:
public struct SafeDateCodableType: Codable {
public var dateValue: Date?
public init(from decoder: Decoder) throws {
if let container = try? decoder.singleValueContainer() {
dateValue = try? container.decode(Date.self)
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
if let date = dateValue {
try container.encode(date)
}
}
}
,此時,模型重新定義爲:
struct SessionTime: Codable {
let sessionStartTime: SafeDateCodableType?
let sessionEndTime: SafeDateCodableType?
let newSessionStartTime: SafeDateCodableType?
let newSessionEndTime: SafeDateCodableType?
}
就不會報錯了。