Swift如何为Struct添加字典初始化方法 将[[String:Any]]转为数据模型
实现方案
直接给Tools结构体新增基于Codable能力的字典初始化方法即可,无需改动原有逻辑,完整代码如下:
struct Tools: Codable{ var name: String var qty : Int init(name: String, qty: Int){ self.name = name self.qty = qty } // 新增字典参数抛出型初始化方法 init(dict: [String: Any]) throws { // 将字典序列化为JSON数据 let jsonData = try JSONSerialization.data(withJSONObject: dict) // 解码JSON得到当前结构体实例 self = try JSONDecoder().decode(Tools.self, from: jsonData) } }
注意事项
- 若你的字典
key和结构体属性名不匹配,可新增CodingKeys枚举做映射,示例:enum CodingKeys: String, CodingKey { case name case qty = "quantity" // 字典中对应数量的key为quantity的情况 } - 若你提到的
toolListDict确实是[[String: Any]]类型(存储多条工具的字典数组),可新增数组扩展批量解析:extension Array where Element == Tools { init(dictArray: [[String: Any]]) throws { let jsonData = try JSONSerialization.data(withJSONObject: dictArray) self = try JSONDecoder().decode([Tools].self, from: jsonData) } } // 批量解析调用示例 let toolsArray = try [Tools](dictArray: toolListDict)
调用示例
建议配合do-catch捕获解析过程中的错误(如字段缺失、类型不匹配等):
do { // 单条工具解析 let singleTool = try Tools(dict: ["name": "扳手", "qty": 10]) print(singleTool.name, singleTool.qty) } catch { print("解析失败: \(error)") }
内容的提问来源于stack exchange,提问作者afi permana
相关产品推荐
相关产品推荐

