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

