我正在尝试创建可编码结构的新实例
@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)
| 归档时间: |
|
| 查看次数: |
13588 次 |
| 最近记录: |