You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5 中如何实现 Date 与 Data 的互相转换?

Swift 5 Date 与 Data 双向转换实现(适配Keychain存储场景)

以下方案所有API均为Swift 5+官方推荐无废弃接口,可直接投入生产使用,解决旧版Swift 3实现存在的API废弃问题。

方案1:轻量转换(性能最优,无归档开销)

核心通过Date内置的timeIntervalSinceReferenceDate(Double类型)做中间桥接,转换逻辑简单无冗余,生成的Data固定为8字节,非常适合Keychain存储:

// Date 转 Data
extension Date {
    func toData() -> Data {
        var timeInterval = self.timeIntervalSinceReferenceDate
        return Data(bytes: &timeInterval, count: MemoryLayout<TimeInterval>.size)
    }
}

// Data 转 Date
extension Data {
    func toDate() -> Date? {
        guard count == MemoryLayout<TimeInterval>.size else { return nil }
        let timeInterval = withUnsafeBytes { $0.load(as: TimeInterval.self) }
        return Date(timeIntervalSinceReferenceDate: timeInterval)
    }
}

方案2:Codable 通用方案(适合统一代码风格场景)

如果项目中大量使用Codable做类型序列化,可使用该方案保持代码逻辑统一:

// Date 转 Data
func dateToData(_ date: Date) throws -> Data {
    return try JSONEncoder().encode(date)
}

// Data 转 Date
func dataToDate(_ data: Data) throws -> Date {
    return try JSONDecoder().decode(Date.self, from: data)
}

使用说明

  • 方案1的返回值做了空值处理,用于过滤非法长度的Data数据,使用时按需解包即可
  • 两种方案均兼容iOS 12+、macOS 10.14+及以上所有系统版本,不存在后续版本适配问题

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:42:01