簡體   English   中英

Swift 在 struct 中創建 init 字典

[英]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 字典,以便我可以將它放入我的結構中?

我只想將該 dict 添加到我的數據模型中,如下所示:

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: $0["Name"] as? String, quantity: $0["qty"] as? Int) 
}

另一種選擇是首先使用JSONSerialization對字典進行JSONSerialization ,然后使用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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM