9

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

public struct Preference: Codable {

    public let id: String

}

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

let preference = Preference(id: "cool")

我收到以下错误:

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

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

4

1 回答 1

16

在没有显式初始化程序的情况下创建结构时

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) {
        // generated decoding code
    }
}

当您尝试使用Preference(id: "cool")另一个目标创建实例时,只有一个公共初始化程序:带有解码器的初始化程序。编译器尝试通过强制转换来使用它,StringDecoder它失败了。

要解决原始问题,您需要public init(id: String)显式添加初始化程序。

于 2018-01-09T20:33:23.790 回答