我正在尝试为可被提取(并发送)到服务器的Codable JSON数据创建数据模型。我有两个问题是
如何设计模型以便创建新的模型对象,设置属性并将其发送到服务器?
如何使用不会因上述错误而抱怨的编码器初始化设计模型?
以下是我的模特之一的示例:
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的那个)?它能以更好的方式完成吗?上面的错误抱怨属性没有在编码器初始化中初始化。
答案 0 :(得分:0)
Codable
由Encodable
&组成。 Decodable
协议。要符合dst[offset].{red,green,blue}
协议,您需要实现所需的方法和初始化程序。要满足您需要实现的Codable
要求:
在您的情况下,您正在实施错误的要求以满足Codable
。 Codable
要求中不存在 init(to encoder:Encoder)
之类的内容。相反,您可能会实施Codable
-
encode(to:)
要了解更多信息,您应该查看Encoding and Decoding Custom Types。