Swift Init不符合预期类型'Decoder'

时间:2018-01-09 19:26:28

标签: swift decodable

目前,我有一个符合Codable的结构:

public struct Preference: Codable {

    public let id: String

}

当我尝试使用以下内容初始化对象时:

let preference = Preference(id: "cool")

我收到以下错误:

Argument type 'String' does not conform to expected type 'Decoder'

如何解决此问题并正确初始化结构?

1 个答案:

答案 0 :(得分:8)

在没有任何显式初始化程序

的情况下创建struct
public 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来使用它并失败。