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属性的对象。
修复步骤
- 首先定义单条逐小时天气的数据模型,所有属性匹配接口返回字段,且遵守
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 }
- 修正
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
相关产品推荐
相关产品推荐

