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

Swift中WeatherModel初始化报错:缺少from参数的问题咨询

问题描述

我在类的init方法中尝试初始化变量,将其赋值为Codable结构体数组[WeatherModel]的首个元素,相关代码如下:

@Published private var CoreData: [WeatherModel]
self.model = CoreData.first ?? WeatherModel()

类初始化代码:

init(CoreData: [WeatherModel], UnitSelected: Units) {
    self.CoreData = CoreData
    self.UnitSelected = UnitSelected
    self.select = (UnitSelected == .metric ? "°C" : "°F")
    self.model = CoreData.first ?? WeatherModel()
}

运行后出现错误提示:Missing argument for parameter 'from' in call. Insert 'from: <#Decoder#>',我的WeatherModel结构体包含自定义Codable实现。

错误原因

当你为WeatherModel实现了自定义的init(from decoder: Decoder) throws解码构造方法后,Swift会自动移除默认生成的无参构造器。此时调用WeatherModel()时,编译器只能找到需要Decoder参数的解码构造器,因此抛出参数缺失的错误。

解决方案

方案1:添加无参构造器

直接给WeatherModel添加一个无参初始化方法,手动将所有可选属性设为nil:

struct WeatherModel : Codable  {
    // 现有属性、计算属性代码保持不变
    
    // 添加无参构造器
    init() {
        cod = nil
        message = nil
        cnt = nil
        list = nil
        city = nil
    }
    
    // 现有init(from decoder:)和encode(to:)方法保持不变
}

方案2:利用空Data解码生成默认实例(可选)

如果不想手动编写无参构造器,可以通过空Data解码生成默认实例(需处理解码失败的情况):
修改类初始化代码中的 fallback 逻辑:

self.model = CoreData.first ?? {
    let emptyData = Data()
    do {
        return try JSONDecoder().decode(WeatherModel.self, from: emptyData)
    } catch {
        // 解码失败时返回手动初始化的实例
        return WeatherModel(cod: nil, message: nil, cnt: nil, list: nil, city: nil)
    }
}()

额外优化:清理CodingKeys

你的CodingKeys中包含了hourlyWeather和dailyWeather,但这两个是计算属性,不需要参与编码/解码,建议从CodingKeys中移除,避免潜在问题:

enum CodingKeys: String, CodingKey {
    case cod = "cod"
    case message = "message"
    case cnt = "cnt"
    case list = "list"
    case city = "city"
    // 移除hourlyWeather和dailyWeather
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:08:15