如何创建 Codable 结构的实例?
How can I create an instance of a Codable Struct?
我正在兜圈子试图使用 Codable 结构。我几乎可以让它工作,但最后出现错误。
这是一个简单的例子:
struct Stuff: Codable {
var title: String = ""
var code: Int = 0
struct Item {
var name: String
var value: Int
}
var items: [Item] = []
init(from decoder: Decoder) throws { }
func encode(to encoder: Encoder) throws { }
}
var items: [Stuff.Item] = []
items.append(Stuff.Item(name: "Apple", value: 1))
items.append(Stuff.Item(name: "banana", value: 2))
var stuff = Stuff(title: "test", code: 23, items: items)
最后一行出现错误
Extra arguments at positions #1, #2, #3 in
显然嵌套结构没问题。如果我删除 :Codable
和 init()
和 func encode()
它会按我预期的那样工作。
正确的做法是什么?
原因:
由于您已经实现了 init(from:)
初始化程序,因此默认的 init
不可用。
那个原因,就是找不到init(title:,code:,items:)
解法:
手动执行初始化程序init(title:,code:,items:)
。此外,Item
也符合 Codable
。
现在,struct Stuff
必须看起来像,
struct Stuff: Codable {
var title: String = ""
var code: Int = 0
struct Item: Codable {
var name: String
var value: Int
}
var items: [Item] = []
init(from decoder: Decoder) throws { }
func encode(to encoder: Encoder) throws { }
init(title: String, code: Int, items: [Item]) {
self.title = title
self.code = code
self.items = items
}
}
我正在兜圈子试图使用 Codable 结构。我几乎可以让它工作,但最后出现错误。
这是一个简单的例子:
struct Stuff: Codable {
var title: String = ""
var code: Int = 0
struct Item {
var name: String
var value: Int
}
var items: [Item] = []
init(from decoder: Decoder) throws { }
func encode(to encoder: Encoder) throws { }
}
var items: [Stuff.Item] = []
items.append(Stuff.Item(name: "Apple", value: 1))
items.append(Stuff.Item(name: "banana", value: 2))
var stuff = Stuff(title: "test", code: 23, items: items)
最后一行出现错误
Extra arguments at positions #1, #2, #3 in
显然嵌套结构没问题。如果我删除 :Codable
和 init()
和 func encode()
它会按我预期的那样工作。
正确的做法是什么?
原因:
由于您已经实现了 init(from:)
初始化程序,因此默认的 init
不可用。
那个原因,就是找不到init(title:,code:,items:)
解法:
手动执行初始化程序init(title:,code:,items:)
。此外,Item
也符合 Codable
。
现在,struct Stuff
必须看起来像,
struct Stuff: Codable {
var title: String = ""
var code: Int = 0
struct Item: Codable {
var name: String
var value: Int
}
var items: [Item] = []
init(from decoder: Decoder) throws { }
func encode(to encoder: Encoder) throws { }
init(title: String, code: Int, items: [Item]) {
self.title = title
self.code = code
self.items = items
}
}