我有一個 [[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 字典,以便我可以將它放入我的結構中?
我只想將該 dict 添加到我的資料模型中,如下所示:
let tool = try Tools(dict: toolListDict)
如果我的英語有點混亂,我希望我解釋清楚,抱歉,謝謝。
uj5u.com熱心網友回復:
這里有兩種可能的解決方案。第一個是從字典元素映射到結構。為此,我們需要一個可失敗的初始化程式,因為我們正在使用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: $0["Name"] as? String, quantity: $0["qty"] as? Int)
}
另一種選擇是首先使用對字典進行編碼JSONSerialization,然后使用對結果進行解碼JSONDecoder,為此我們需要向CodingKey自定義型別添加一個列舉
enum CodingKeys: String, CodingKey {
case name = "Name"
case quantity = "qty"
}
并且編碼/解碼是這樣完成的
do {
let data = try JSONSerialization.data(withJSONObject: toolListDict)
let tools = try JSONDecoder().decode([Tool].self, from: data)
//...
} catch {
print(error)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344250.html
下一篇:代碼魔術|iOS構建失敗
