Swift 在结构中创建初始化字典
Swift make init Dictionary in struct
我有一个[[String:Any]],我想把它放在我的结构数据模型中,因为我想编辑数据,谁能告诉我我应该如何制作可以包含的字典这种字典?
这是 var 字典:
let toolListDict : [[String:Any]] = [
[
"Name": "Wrench",
"qty": 6
],
[
"Name": "Cutter",
"qty": 15
],
[
"Name": "Pliers",
"qty": 12
],
[
"Name": "ScrewDriver",
"qty": 13
],
[
"Name": "Welding Machine",
"qty": 3
],
[
"Name": "Welding Glasses",
"qty": 7
],
[
"Name": "Hammer",
"qty": 4
],
[
"Name": "Measuring Tape",
"qty": 9
],
[
"Name": "Alan Keyset",
"qty": 4
],
[
"Name": "Air Compressor",
"qty": 2
]
]
到目前为止,这是我创建的模型数据:
struct Tools: Codable{
var name: String
var qty : Int
init(name: String, qty: Int){
self.name = name
self.qty = qty
}
}
如何在我的结构中创建一个 init 字典,这样我就可以将它放入我的结构中?
我想像这样将该字典添加到我的数据模型中:
let tool = try Tools(dict: toolListDict)
我希望我能解释清楚,如果我的英语有点混乱,谢谢。
这里有两种可能的解决方案。第一个是将字典元素映射到结构中。为此,我们需要一个可失败的初始化器,因为我们正在使用 compactMap
请注意,我冒昧地更改了一些自定义类型的命名
struct Tool: Codable {
var name: String
var quantity : Int
init?(name: String?, quantity: Int?) {
guard let name = name, let quantity = quantity else {
return nil
}
self.name = name
self.quantity = quantity
}
//...
}
那么转换就变得简单了toolListDict
let tools = toolListDict.compactMap {
Tool(name: [=11=]["Name"] as? String, quantity: [=11=]["qty"] as? Int)
}
另一种选择是先使用 JSONSerialization
对字典进行编码,然后使用 JSONDecoder
对结果进行解码,为此我们需要向自定义类型添加一个 CodingKey
枚举
enum CodingKeys: String, CodingKey {
case name = "Name"
case quantity = "qty"
}
并且 encoding/decoding 是这样完成的
do {
let data = try JSONSerialization.data(withJSONObject: toolListDict)
let tools = try JSONDecoder().decode([Tool].self, from: data)
//...
} catch {
print(error)
}
我有一个[[String:Any]],我想把它放在我的结构数据模型中,因为我想编辑数据,谁能告诉我我应该如何制作可以包含的字典这种字典?
这是 var 字典:
let toolListDict : [[String:Any]] = [
[
"Name": "Wrench",
"qty": 6
],
[
"Name": "Cutter",
"qty": 15
],
[
"Name": "Pliers",
"qty": 12
],
[
"Name": "ScrewDriver",
"qty": 13
],
[
"Name": "Welding Machine",
"qty": 3
],
[
"Name": "Welding Glasses",
"qty": 7
],
[
"Name": "Hammer",
"qty": 4
],
[
"Name": "Measuring Tape",
"qty": 9
],
[
"Name": "Alan Keyset",
"qty": 4
],
[
"Name": "Air Compressor",
"qty": 2
]
]
到目前为止,这是我创建的模型数据:
struct Tools: Codable{
var name: String
var qty : Int
init(name: String, qty: Int){
self.name = name
self.qty = qty
}
}
如何在我的结构中创建一个 init 字典,这样我就可以将它放入我的结构中?
我想像这样将该字典添加到我的数据模型中:
let tool = try Tools(dict: toolListDict)
我希望我能解释清楚,如果我的英语有点混乱,谢谢。
这里有两种可能的解决方案。第一个是将字典元素映射到结构中。为此,我们需要一个可失败的初始化器,因为我们正在使用 compactMap
请注意,我冒昧地更改了一些自定义类型的命名
struct Tool: Codable {
var name: String
var quantity : Int
init?(name: String?, quantity: Int?) {
guard let name = name, let quantity = quantity else {
return nil
}
self.name = name
self.quantity = quantity
}
//...
}
那么转换就变得简单了toolListDict
let tools = toolListDict.compactMap {
Tool(name: [=11=]["Name"] as? String, quantity: [=11=]["qty"] as? Int)
}
另一种选择是先使用 JSONSerialization
对字典进行编码,然后使用 JSONDecoder
对结果进行解码,为此我们需要向自定义类型添加一个 CodingKey
枚举
enum CodingKeys: String, CodingKey {
case name = "Name"
case quantity = "qty"
}
并且 encoding/decoding 是这样完成的
do {
let data = try JSONSerialization.data(withJSONObject: toolListDict)
let tools = try JSONDecoder().decode([Tool].self, from: data)
//...
} catch {
print(error)
}