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

Swift中AGResults类与类型别名两种定义方式的差异及解码报错原因解析

两种AGResults实现的差异与解码错误原因解析

咱们先把核心差异说清楚,再拆解错误的根源:

1. 两种实现的本质区别

  • 类版本的AGResults:这是一个独立的自定义类,遵循Codable协议,内部封装了一个geoFencing数组属性。从JSON解析逻辑来看,这个类对应的是一个JSON对象(字典),要求数据必须是带geo_fencing键的结构,键值才是数组内容。
  • 类型别名版本的AGResults:它只是[ActiveGeoFencingArray]的“别称”,本质上就是普通的数组类型,直接对应JSON里的纯数组结构,不需要任何外层包裹字段。

2. 解码错误的具体原因

你的geoFencingDic对应的JSON是纯数组格式,但用类版本的AGResults解码时,JSONDecoder会严格按照类的结构去匹配——它期望拿到一个包含geo_fencing键的字典,结果实际收到的是数组,自然就抛出了typeMismatch错误,提示“Expected to decode Dictionary<String, Any> but found an array instead”。

咱们用JSON格式直观对比:

  • 类版本AGResults要求的JSON格式:
    {
      "geo_fencing": [
        // ActiveGeoFencingArray对应的元素内容
      ]
    }
    
  • 类型别名版本要求的JSON格式:
    [
      // ActiveGeoFencingArray对应的元素内容
    ]
    

显然你的数据源是第二种纯数组格式,所以类型别名能正常解码,类版本就会触发类型不匹配的错误。

3. 该怎么选择实现方式?

如果后端返回的是直接的数组数据,就用类型别名的方式;如果后端返回的是包含数组的外层对象(带geo_fencing这类键),再用类的实现。两者对应了完全不同的JSON结构,这就是解码结果差异的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:52:35