使用Swift解码Firebase Realtime Database响应报类型不匹配错误
Swift 解码Firebase Realtime Database数据报错修复
报错核心原因
解码错误由两处类型不匹配问题导致:
usedBy字段结构不匹配:Firebase返回的usedBy是以自动生成的push ID为键、使用记录为值的字典结构,但PromoCode模型中把该字段定义为[PromoCodeUsed]数组类型,解码器预期读取数组结构却拿到字典,直接触发如下报错:typeMismatch(Swift.Array
, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "usedBy", intValue: nil)], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyingError: nil)) paid字段类型不匹配:PromoCodeUsed模型中paid定义为Int类型,但接口实际返回的是Bool类型值(false),就算修复第一个结构问题,这里也会触发新的类型不匹配解码错误。
修复方案
1. 修正数据模型定义,对齐接口返回结构
调整两个Codable结构体的字段定义,完全匹配Firebase返回的数据格式:
struct PromoCode: Codable { var active: Int var amount: Int? var code: String var percent: Int? var owner: Int? // 改为字典类型接收,key为Firebase生成的push ID字符串 var usedBy: [String: PromoCodeUsed]? } struct PromoCodeUsed: Codable { var amount: Int var date: String var paid: Bool // 修正为和返回值一致的Bool类型 var userid: Int }
2. (可选)适配业务层数组使用需求
如果业务逻辑需要使用数组格式的使用记录,不需要修改解码逻辑,直接给PromoCode加计算属性转换即可:
extension PromoCode { /// 提取使用记录为数组,可按需增加排序逻辑 var usedByArray: [PromoCodeUsed] { guard let usedByMap = usedBy else { return [] } return Array(usedByMap.values) } }
3. 原有数据获取逻辑无需调整
现有getPromoCodeInfo方法中,通过DataSnapshot取value、序列化后用JSONDecoder解码的逻辑没有问题,模型修正后即可正常解码拿到数据。
内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

