【问题标题】:Missing argument for parameter 'from' in call when creating instance of Codable class创建 Codable 类的实例时,调用中缺少参数“from”的参数
【发布时间】:2019-06-30 21:28:13
【问题描述】:

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

var x = Articles();

给我以下错误:

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

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

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

【问题讨论】:

  • 查看Decodable中的init(from:)方法。
  • 我在没有参数的情况下添加了自己的初始化程序,但它没有解决它。我有点想:class Articles: Codable { init() { value = nil; } 让值:[文章]? }
  • 终于让它工作了。让我失望的是对参数的需求。其他编程语言具有不同的行为,即使子类具有构造函数,也必须显式定义构造函数。它在 Swift 中的工作方式完全不同。我什至不能创建一个只设置一些 Codable 属性(必须是全部)的构造函数。这也与其他编程语言(如 JAVA 或 C#)的操作方式有很大不同。

标签: swift


【解决方案1】:

我不明白,因为这是一个无参数类。我不知道 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 如果你的子类没有定义任何指定的初始化器,它 自动继承其所有超类指定的初始化器。

如果您查看docsCodabletypealiasDecodable 协议(协议就像java 中的接口)。 Protocols 指定类在采用协议时必须实现的功能。您的Articles 类采用Decodable 协议。但是,Decodable 的文档说,

init(from: Decoder)

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

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

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

【讨论】:

  • 我理解继承。当一个类继承另一个类时,构造函数的使用方式的差异让我感到震惊。其他编程语言处理要求在您的类中显式定义这些构造函数,并且构造函数不会被继承。我需要更好地理解 Swift 如何处理继承的实现细节,我会告诉你的......
  • @user1060500,是的。这实际上是我们在这里讨论的协议。在我的答案底部查看我的 cmets。
  • 构造函数不是继承的——我也发布了来自文档的引用。
  • 感谢您将这些有用的信息整合在一起。
猜你喜欢
  • 2021-10-02
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多