可编码数据模型 - 在初始化所有存储属性之前自行使用

时间:2018-03-30 05:58:35

标签: json swift codable

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

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

  2. 如何使用不会因上述错误而抱怨的编码器初始化设计模型?

  3. 以下是我的模特之一的示例:

    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)
        }
    }
    

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

1 个答案:

答案 0 :(得分:0)

CodableEncodable&组成。 Decodable协议。要符合dst[offset].{red,green,blue}协议,您需要实现所需的方法和初始化程序。要满足您需要实现的Codable要求:

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

encode(to:)

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