【问题标题】:Swift Init does not conform to expected type 'Decoder'Swift Init 不符合预期的“解码器”类型
【发布时间】:2018-06-18 21:50:52
【问题描述】:

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

public struct Preference: Codable {

    public let id: String

}

当我尝试使用以下方法初始化对象时:

let preference = Preference(id: "cool")

我收到以下错误:

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

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

【问题讨论】:

  • 奇怪,在我的 Xcode 9.2 中编译没有问题。
  • 我也无法重现这个。我怀疑这不是实际的代码。这个错误出现在哪一行? Preference 在您的代码中是否恰好有这一属性?
  • 开始一个新项目,尝试构造一个minimal reproducible example
  • @RobNapier 这是实际代码,尝试初始化对象时发生错误。
  • 也许你自动完成到let preference = Preference(from: "cool")?那会给你那个错误。也许您忘记将其更改为正确的初始化程序或更改了它并且编译器追赶速度很慢?也许尝试清洁?

标签: swift decodable


【解决方案1】:

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

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") 创建实例时,只有一个公共初始化程序:带有解码器的初始化程序。编译器尝试通过将String 转换为Decoder 来使用它,但它失败了。

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

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多