MST
星途 面试题库

面试题:Swift的Codable协议下,自定义日期格式在数据解析中的应用

假设API返回的日期格式为`yyyy-MM-dd HH:mm:ss`,现有一个结构体`Event`,包含一个`date`属性用于存储日期。请利用Codable协议,实现`Event`结构体的编码和解码,确保日期能够按照上述自定义格式正确处理。如果日期格式错误,如何进行合适的错误处理?
47.8万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
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)
    }
}

在上述代码中:

  1. Event结构体遵循Codable协议,实现了自定义的编码和解码逻辑。
  2. init(from:)方法中,从解码器获取日期字符串,使用DateFormatter按照指定格式解析日期。如果解析失败,抛出DecodingError.dataCorruptedError错误。
  3. encode(to:)方法中,使用DateFormatterDate对象格式化为指定格式的字符串,然后进行编码。