创建 Codable 类的实例时,调用中缺少参数“from”的参数

use*_*500 5 swift

我正在尝试创建一个可编码类的新实例,但我不确定如何:

var x = Articles();
Run Code Online (Sandbox Code Playgroud)

给了我以下错误:

调用中缺少参数“from”的参数

class Articles: Codable {
    let value: [Article]? 
}
Run Code Online (Sandbox Code Playgroud)

我不明白,因为这是一个无参数类。我不知道 from 参数是什么。

7st*_*tud 7

我不明白,因为这是一个无参数类。我不知道 from 参数是什么。

当我运行以下命令时,我没有收到任何错误:

class Articles: Codable {
    let value: [Articles]?

    init() {
        value = nil
        print("in init()")
    }
}

var x = Articles()
Run Code Online (Sandbox Code Playgroud)

输出:

in init()
Run Code Online (Sandbox Code Playgroud)

并且没有init()

class Articles: Codable {
    let value: [Articles]?

//    init() {
//        value = nil
//        print("in init()")
//    }
}

var x = Articles()  //Missing argument for parameter 'from' in call
Run Code Online (Sandbox Code Playgroud)

首先,阅读这个

自动初始化继承

如上所述,默认情况下子类不继承其超类初始值设定项。但是,如果满足某些条件,则自动继承超类初始值设定项。在实践中,这意味着您不需要在许多常见场景中编写初始化器覆盖,并且可以在安全的情况下以最少的努力继承您的超类初始化器。

假设您为在子类中引入的任何新属性提供默认值,则适用以下两条规则:

规则 1 如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。

如果你看一下文档CodabletypealiasDecodable协议(协议就像是在Java的接口)。 协议指定了一个类如果采用该协议必须实现的功能。您的Articles班级采用该Decodable协议。但是,可解码的文档说,

init(from: Decoder)

通过从给定的解码器解码来创建一个新实例。必需的。 提供了默认实现

协议实际上可以通过使用扩展实现功能,然后由采用该协议的类继承。

因此,您的类唯一指定的初始化程序是Decodable协议中定义的初始化程序,它接受一个参数——您根据 继承该参数Rule 1。另一方面,当您在类中显式定义另一个不带参数的指定初始化程序时,您将在不提供参数时调用该初始化程序。