Codable 数据模型 - 在初始化所有存储的属性之前自用

Codable Data Model - self used before all stored properties are initialized

我正在尝试为正在获取(并发送)到服务器的 Codable JSON 数据创建数据模型。我的两个问题是

  1. 如何设计模型以便创建新的模型对象、设置属性并将其发送到服务器?

  2. 如何设计带有编码器初始化的模型,不会出现上述错误?

这是我的一个模型的外观示例:

struct TestRailSection : Codable
{
    let id:Int
    let suiteID:Int
    let parentID:Int
    let depth:Int
    let displayOrder:Int
    let name:String
    let description:String

    enum CodingKeys : String, CodingKey
    {
        case id           = "id"
        case suiteID      = "suite_id"
        case parentID     = "parent_id"
        case displayOrder = "display_order"
        case depth        = "depth"
        case name         = "name"
        case description  = "description"
    }

    init(name:String, description:String)
    {
        id = 0
        suiteID = 0
        parentID = 0
        depth = 0
        displayOrder = 0
        self.name = name
        self.description = description
    }

    init(from decoder:Decoder) throws
    {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        do { id           = try values.decode(Int.self,    forKey: .id) }           catch { id = 0 }
        do { suiteID      = try values.decode(Int.self,    forKey: .suiteID) }      catch { suiteID = 0 }
        do { parentID     = try values.decode(Int.self,    forKey: .parentID) }     catch { parentID = 0 }
        do { depth        = try values.decode(Int.self,    forKey: .depth) }        catch { depth = 0}
        do { displayOrder = try values.decode(Int.self,    forKey: .displayOrder) } catch { displayOrder = 0 }
        do { name         = try values.decode(String.self, forKey: .name) }         catch { name = ""}
        do { description  = try values.decode(String.self, forKey: .description) }  catch { description = "" }
    }

    init(to encoder:Encoder) throws
    {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(suiteID, forKey: .suiteID)
        try container.encode(parentID, forKey: .parentID)
        try container.encode(depth, forKey: .depth)
        try container.encode(displayOrder, forKey: .displayOrder)
        try container.encode(name, forKey: .name)
        try container.encode(description, forKey: .description)
    }
}

我可以用这个成功地从服务器获取数据,但是我如何创建一个编码模型?是否需要额外的初始化(没有 en/decoder 的初始化)?可以用更好的方式完成吗?上述错误抱怨属性未在编码器初始化中初始化。

Codable is composed of Encodable & Decodable 协议。为了符合 Codable 协议,您需要实现所需的方法和初始化程序。要满足 Codable 要求,您需要实施:


在您的情况下,您正在实施 错误的 要求来满足 CodableCodable 要求中不存在 init(to encoder:Encoder)。相反,您可能会实施 encode(to:)-

func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(id, forKey: .id)
    try container.encode(suiteID, forKey: .suiteID)
    try container.encode(parentID, forKey: .parentID)
    try container.encode(depth, forKey: .depth)
    try container.encode(displayOrder, forKey: .displayOrder)
    try container.encode(name, forKey: .name)
    try container.encode(description, forKey: .description)
}

要了解更多,您应该看看 Encoding and Decoding Custom Types