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

使用Swift解码Firebase Realtime Database响应报类型不匹配错误

Swift 解码Firebase Realtime Database数据报错修复

报错核心原因

解码错误由两处类型不匹配问题导致:

  1. 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))

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:06:27