swift 调用中缺少参数“from "的参数,请插入”from:< #Decoder#>“

wlzqhblo  于 5个月前  发布在  Swift
关注(0)|答案(3)|浏览(64)

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

@State private var parcel = Parcel()

字符串
但我得到了这个错误:
调用Insert“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
}

mefy6pfw

mefy6pfw1#

Swift中的每个对象都需要一个初始化器:在第一次创建对象时设置对象的一些代码。如果你的对象是一个类的示例,初始化器需要由你显式定义。但是如果对象是一个 struct 的示例,Swift隐式定义一个初始化器。例如,这个struct

struct Foo {
  let bar: Int
}

字符串
隐式地获取一个初始化器,如下所示:

init(bar: Int) {
   self.bar = bar
 }


初始化器也可以通过协议扩展隐式创建。这意味着如果您的结构继承了一个协议(如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)
}


在您的例子中,当您编写parcel = Parcel()时,您正在调用这种初始化器

init() {
  // initialize somehow with no input!
}


编译器建议你调用从Codable得到的初始化器,因为它是一个近似匹配,但这可能也不是你想要的。
你可以定义缺少的初始化器,或者为结构体的所有成员定义默认值。如果你这样做,Swift定义的隐式初始化器将没有参数,使你的代码有效。例如

struct Foo {
  let bar: Int = 3
}

let f = Foo() // now this is valid, implicit init has no arguments

oyjwcjzk

oyjwcjzk2#

默认情况下,结构体会在后台为你声明的每个非可选属性创建一个初始化器。所以通过简单地创建一个结构体的示例,你需要包含它所需要的所有非可选值。如果你不想在初始化它时添加值,可以将它们改为vars并使它们成为可选的(在末尾添加?)。

xkftehaa

xkftehaa3#

如果你在包的内部写了你的“struct”,并且想在外部创建一个对象,那么让init公开。

相关问题