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

SwiftUI天气App解析OpenWeatherMap逐小时数据Array泛型报错

报错根因
  • Swift 的 Array 是泛型类型,声明时必须通过 <> 明确数组内存储的元素类型,裸写 Array 会直接触发Reference to generic type 'Array' requires arguments in <...>报错。
  • 你尝试使用 Array<Any> 无法解决问题的核心原因:Any 类型不遵守 Decodable 协议,JSON解码器无法自动将接口返回的数据转换为不确定类型的Any值,解码逻辑根本无法执行。
  • 额外结构偏差:你当前嵌套的HourlyResponse结构不符合主流天气OneCall类接口的返回规范,绝大多数开放天气接口根节点下的hourly字段本身就是逐小时数据数组,不需要额外包裹一层带hourly属性的对象。
修复步骤
  1. 首先定义单条逐小时天气的数据模型,所有属性匹配接口返回字段,且遵守Decodable协议(如果你已经定义过Current天气对应的Weather模型,可以直接复用,无需重复创建):
// 单条逐小时数据结构,可根据你实际接口返回的字段增删属性
struct HourlyWeather: Decodable {
    let dt: Int
    let temp: Double
    let feels_like: Double
    let pressure: Int
    let humidity: Int
    let wind_speed: Double
    let weather: [WeatherDetail]
}

// 天气详情通用模型,可直接复用你当前CurrentResponse里已有的同名模型
struct WeatherDetail: Decodable {
    let id: Int
    let main: String
    let description: String
    let icon: String
}
  1. 修正OneCall结构体的字段声明,推荐直接去掉多余的HourlyResponse嵌套层,将hourly直接声明为[HourlyWeather]类型([Element]是Array<Element>的语法简写,两者完全等价):
struct OneCall: Decodable {
    let lat, lon: Double
    let timezone: String
    let timezone_offset: Int
    let current: CurrentResponse
    let hourly: [HourlyWeather]
}

如果你对接的是自定义接口,返回的hourly字段确实是嵌套了一层包含hourly属性的对象,只需给嵌套结构里的数组指定明确元素类型即可:

struct OneCall: Decodable {
    let lat, lon: Double
    let timezone : String
    let timezone_offset : Int
    let current: CurrentResponse
    let hourly: HourlyResponse

    struct HourlyResponse: Decodable{
        // 明确指定数组元素为HourlyWeather类型
        var hourly: [HourlyWeather]
    }
}
注意事项
  • 解码模型的属性名、类型必须和接口返回的JSON字段完全匹配,如果存在命名不一致的情况,需要通过自定义CodingKeys做映射。
  • 所有用于Decodable解码的属性,必须是明确遵守Decodable协议的具体类型,禁止使用Any这类无类型约束的声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:36:26