Swift读取Firestore数据库时Timestamp字段为nil引发应用崩溃问题求助
解决方案
你的崩溃根源是代码中对可选类型的created_at使用了强制解包(!),结合你的场景可以按以下两种方式处理:
方式1:给Timestamp类型设置默认值(适配模型非可选场景)
和String、Int类型一样用??运算符指定默认值即可,Firestore的Timestamp支持直接构造默认实例:
// 可选默认值1:缺失时默认取当前时间 let created_at = data["created_at"] as? Timestamp ?? Timestamp(date: Date()) // 可选默认值2:缺失时默认取1970年基准时间,方便后续做异常展示 // let created_at = data["created_at"] as? Timestamp ?? Timestamp(date: Date(timeIntervalSince1970: 0))
修改后你原来的日期格式化代码就可以直接使用,不用改强制解包逻辑。
方式2:保留created_at为可选类型,使用时做安全解包(适配模型可选场景)
如果你的TmTransition模型的created_at属性本身就是可选类型,只需要把原来的强制解包逻辑改成安全解包即可:
// 原来的强制解包代码会崩溃 // let date: Date = created_at!.dateValue() // 替换为安全解包逻辑 let date: Date = created_at?.dateValue() ?? Date(timeIntervalSince1970: 0) formatter2.dateFormat = "MM-dd-yyyy HH:mm" let createdDate = formatter2.string(from: date) // 如果你想对缺失时间做特殊展示,也可以用可选绑定: // var createdDate = "暂无时间" // if let created_at = created_at { // let date = created_at.dateValue() // createdDate = formatter2.string(from: date) // }
最佳实践
建议从数据写入侧规避created_at为nil的问题,新增文档到COLLECTION_TM_TRANSITIONS_UAT集合时,强制写入created_at字段为当前Timestamp,从根源避免读取时的空值问题。
内容的提问来源于stack exchange,提问作者Noch PhaNith
相关产品推荐
相关产品推荐

