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

时间:2019-06-30 21:28:13

标签: swift

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

var x = Articles();

给我以下错误:

  

调用中缺少参数'from'的参数

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

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

1 个答案:

答案 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,则Codabletypealias协议的Decodable(协议类似于Java中的接口)。 Protocols指定类采用协议必须实现的功能。您的Articles类采用Decodable协议。但是,Decodable的文档说,

  

init(from: Decoder)

     

通过从给定的解码器进行解码来创建新实例。需要。   提供了默认实施

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

因此,您的类的唯一指定的初始化程序是Decodable协议中定义的初始化程序,该协议带有一个参数-您可以根据Rule 1继承该参数。另一方面,当您在类中显式定义不带任何参数的指定初始化器时,则在不提供任何参数的情况下将调用该初始化器。