Swift Init 不符合预期的“解码器”类型

Posted

技术标签:

【中文标题】Swift Init 不符合预期的“解码器”类型【英文标题】:Swift Init does not conform to expected type 'Decoder' 【发布时间】: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")?那会给你那个错误。也许您忘记将其更改为正确的初始化程序或更改了它并且编译器追赶速度很慢?也许尝试清洁? 【参考方案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) 初始化程序。

【讨论】:

以上是关于Swift Init 不符合预期的“解码器”类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用 init 初始化模型对象(来自解码器:)

用解码器Swift的init解码JSON

Swift JSON解码器类型不匹配错误

来自符合协议的未知类的 Swift init

参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable'

参数类型 '[HKCategoryType?]' 不符合预期的类型 'Hashable'