我正在尝试创建可编码类的新实例,但不确定如何:
var x = Articles();
给我以下错误:
调用中缺少参数'from'的参数
class Articles: Codable {
let value: [Article]?
}
我不明白,因为这是无参数的类。我不知道from参数是什么。
答案 0 :(得分:0)
我不明白,因为这是无参数的类。我不知道 from参数的意义所在。
运行以下命令时,我不会出现任何错误:
class Articles: Codable {
let value: [Articles]?
init() {
value = nil
print("in init()")
}
}
var x = Articles()
输出:
in init()
并且没有init()
:
class Articles: Codable {
let value: [Articles]?
// init() {
// value = nil
// print("in init()")
// }
}
var x = Articles() //Missing argument for parameter 'from' in call
首先,阅读this:
自动初始化继承项
如上所述,子类不继承其超类 默认情况下初始化。但是,超类初始化程序是 如果满足某些条件,则自动继承。在实践中, 这意味着您无需在许多情况下编写初始值设定项覆盖 常见情况,并且可以继承您的超类初始化程序 在安全的情况下,尽力而为。
假设您为任何新属性提供默认值 在子类中引入以下两个规则:
规则1如果您的子类未定义任何指定的初始化程序,则它 自动继承其所有超类指定的初始化程序。
如果您查看docs,则Codable
是typealias
协议的Decodable
(协议类似于Java中的接口)。 Protocols指定类采用协议必须实现的功能。您的Articles
类采用Decodable
协议。但是,Decodable的文档说,
init(from: Decoder)
通过从给定的解码器进行解码来创建新实例。需要。 提供了默认实施。
协议实际上可以通过使用extensions 实现 功能,然后由采用该协议的类继承。
因此,您的类的唯一指定的初始化程序是Decodable
协议中定义的初始化程序,该协议带有一个参数-您可以根据Rule 1
继承该参数。另一方面,当您在类中显式定义不带任何参数的指定初始化器时,则在不提供任何参数的情况下将调用该初始化器。