面试题答案
一键面试import Foundation
struct Event: Codable {
var date: Date
private enum CodingKeys: String, CodingKey {
case date
}
init(date: Date) {
self.date = date
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let dateString = try container.decode(String.self, forKey: .date)
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
if let date = formatter.date(from: dateString) {
self.date = date
} else {
throw DecodingError.dataCorruptedError(forKey: .date, in: container, debugDescription: "Invalid date format")
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let dateString = formatter.string(from: date)
try container.encode(dateString, forKey: .date)
}
}
在上述代码中:
Event
结构体遵循Codable
协议,实现了自定义的编码和解码逻辑。- 在
init(from:)
方法中,从解码器获取日期字符串,使用DateFormatter
按照指定格式解析日期。如果解析失败,抛出DecodingError.dataCorruptedError
错误。 - 在
encode(to:)
方法中,使用DateFormatter
将Date
对象格式化为指定格式的字符串,然后进行编码。