如何创建 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

显然嵌套结构没问题。如果我删除 :Codableinit()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
    }
}