Codable 数据模型 - 在初始化所有存储的属性之前自用
Codable Data Model - self used before all stored properties are initialized
我正在尝试为正在获取(并发送)到服务器的 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)
}
}
我可以用这个成功地从服务器获取数据,但是我如何创建一个编码模型?是否需要额外的初始化(没有 en/decoder 的初始化)?可以用更好的方式完成吗?上述错误抱怨属性未在编码器初始化中初始化。
Codable
is composed of Encodable
& Decodable
协议。为了符合 Codable
协议,您需要实现所需的方法和初始化程序。要满足 Codable
要求,您需要实施:
在您的情况下,您正在实施 错误的 要求来满足 Codable
。 Codable
要求中不存在 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。
我正在尝试为正在获取(并发送)到服务器的 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)
}
}
我可以用这个成功地从服务器获取数据,但是我如何创建一个编码模型?是否需要额外的初始化(没有 en/decoder 的初始化)?可以用更好的方式完成吗?上述错误抱怨属性未在编码器初始化中初始化。
Codable
is composed of Encodable
& Decodable
协议。为了符合 Codable
协议,您需要实现所需的方法和初始化程序。要满足 Codable
要求,您需要实施:
在您的情况下,您正在实施 错误的 要求来满足 Codable
。 Codable
要求中不存在 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。