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

Swift Codable模型调用无参构造器提示Insert 'from: <#Decoder#>'如何解决

问题原因

因为你为MyModel实现了Codable协议,Swift会自动生成基于Decoder的初始化方法,此时结构体默认的自动成员初始化器、无参数初始化器都会被覆盖。你没有手动声明无参数的init()方法,所以直接调用MyModel()会触发编译器报错,误以为你要调用Codable协议要求的init(from:)初始化方法。

解决方案

提供三种常用方案,按需选择即可:

方案1:直接声明可选类型不赋值(最推荐)

你的myVar本身就是可选类型,默认值就是nil,完全不需要提前创建空实例,后续接口请求/数据处理完成后再赋值即可:

@State var myVar: MyModel?

方案2:手动为模型添加无参数初始化器

如果业务场景确实需要默认空实例,就手动实现无参init,注意非可选的data属性需要对应ASubModelData也提供默认初始化能力:

struct MyModel: Codable, Hashable {
    let data: ASubModelData
    let error: Bool?
    let error_message: String?
    let error_code: Int?
    
    // 自定义无参数初始化器
    init() {
        self.data = ASubModelData() // 需确保ASubModelData也支持无参数初始化
        self.error = nil
        self.error_message = nil
        self.error_code = nil
    }
}

之后原有初始化代码即可正常运行:

@State var myVar: MyModel? = MyModel()

方案3:直接用自动成员初始化器创建实例

不想改模型定义的话,也可以直接调用自动生成的成员初始化器传默认值:

@State var myVar: MyModel? = MyModel(
    data: ASubModelData(),
    error: nil,
    error_message: nil,
    error_code: nil
)
注意事项

如果ASubModelData也是自定义的Codable模型,需要同步为它添加无参数初始化器,否则调用ASubModelData()时也会触发同类报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:15:03