调用中缺少参数“from”的参数。插入“来自:<#Decoder#>”

cja*_*jay 4 ios swift

我正在尝试创建可编码结构的新实例

@State private var parcel = Parcel()
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

调用插入“from: <#Decoder#>”时缺少参数“from”的实参

struct Parcel: Codable {
    var created_at: String
    var height: Double
    var id: String
    var length: Double
    var mode: String?
    var object: String
    var predefined_package: String?
    var updated_at: String?
    var weight: Double
    var width: Double
}
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 15

Swift 中的每个对象都需要一个初始化程序:在第一次创建对象时设置一些代码。如果您的对象是类的实例,则初始化程序需要由您显式定义。然而,如果对象是struct的实例,Swift 会隐式定义一个初始值设定项。例如,这个结构体

struct Foo {
  let bar: Int
}
Run Code Online (Sandbox Code Playgroud)

隐式获取一个如下所示的初始值设定项

 init(bar: Int) {
   self.bar = bar
 }
Run Code Online (Sandbox Code Playgroud)

初始化器也可以通过协议扩展隐式创建。这意味着如果您的结构继承了协议(例如Codable),则该协议可以为您定义其他初始值设定项。对于这个简单的例子,Codable会添加这样的东西

init(from decoder: Decoder) throws {
  // decode a key value pair with name "bar" and an Int value using decoder
  let decodedBar = try ...
  self.init(bar: decodedBar)
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,当您编写时,parcel = Parcel()您正在调用这种初始化程序

init() {
  // initialize somehow with no input!
}
Run Code Online (Sandbox Code Playgroud)

但你从来没有定义过这样的东西!编译器建议您调用从中获得的初始化程序,Codable因为它非常匹配,但这可能也不是您想要的。

您可以定义缺少的初始值设定项,也可以为结构的所有成员定义默认值。如果这样做,Swift 定义的隐式初始化器将没有参数,从而使您的代码有效。例如

struct Foo {
  let bar: Int = 3
}

let f = Foo() // now this is valid, implicit init has no arguments
Run Code Online (Sandbox Code Playgroud)