目前,我有一个符合Codable的结构:
public struct Preference: Codable {
public let id: String
}
当我尝试使用以下内容初始化对象时:
let preference = Preference(id: "cool")
我收到以下错误:
Argument type 'String' does not conform to expected type 'Decoder'
如何解决此问题并正确初始化结构?
答案 0 :(得分:8)
在没有任何显式初始化程序
的情况下创建structpublic struct Preference {
public let id: String
}
它获得合成的初始化程序,例如internal init(id: String)
。事情是它是内部的,所以如果你试图从另一个目标使用它,你将得到编译器错误。
当您向结构中添加Decodable
时,它会被合成public init(from: Decoder)
初始化程序。
所以初始结构等效于以下
public struct Preference: Codable {
public let id: String
internal init(id: String) {
self.id = id
}
public init(from: Decoder) {
//decoding here
}
}
因此,如果您尝试使用Preference(id: "cool")
创建实例,则编译器只有一个初始化程序:带解码器的初始化程序。编译器尝试通过将String
强制转换为Decoder
来使用它并失败。