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
相关产品推荐
相关产品推荐

