我正在尝试创建一个可编码类的新实例,但我不确定如何:
var x = Articles();
Run Code Online (Sandbox Code Playgroud)
给了我以下错误:
调用中缺少参数“from”的参数
class Articles: Codable {
let value: [Article]?
}
Run Code Online (Sandbox Code Playgroud)
我不明白,因为这是一个无参数类。我不知道 from 参数是什么。
我不明白,因为这是一个无参数类。我不知道 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 如果您的子类没有定义任何指定的初始值设定项,它会自动继承其所有超类指定的初始值设定项。
如果你看一下文档,Codable是typealias对Decodable协议(协议就像是在Java的接口)。 协议指定了一个类如果采用该协议必须实现的功能。您的Articles班级采用该Decodable协议。但是,可解码的文档说,
init(from: Decoder)通过从给定的解码器解码来创建一个新实例。必需的。 提供了默认实现。
协议实际上可以通过使用扩展来实现功能,然后由采用该协议的类继承。
因此,您的类唯一指定的初始化程序是Decodable协议中定义的初始化程序,它接受一个参数——您根据 继承该参数Rule 1。另一方面,当您在类中显式定义另一个不带参数的指定初始化程序时,您将在不提供参数时调用该初始化程序。