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
相关产品推荐
相关产品推荐

