1.swift4出现了 Codable协议,只要继承该协议,便可使用系统的模型转换,字典转模型,模型转字典。
2.本人重新封装了一下decode方法
3.调用
比如你有一个这样的模型和字典
struct People: Codable{
var age: Int?
var money: Double?
}
let dic: [String:Any] = ["age":23,"money":9833.67]
便可以调用字典转模型
if let model = try? LsqDecoder.decode(People.self, param: dic){
print(model)
}
//这里返回的模型就为传的模型类型,如果字典中没有找到该key,或者值的类型对应不上,则不会赋值,为nil。
附上源代码:
structLsqDecoder {
//TODO:转换模型(单个)
publicstaticfuncdecode(_type:T.Type, param: [String:Any]) ->T?whereT:Decodable{
guardletjsonData =self.getJsonData(with: param)else{
returnnil
}
guardletmodel =try?JSONDecoder().decode(type, from: jsonData)else{
returnnil
}
returnmodel
}
//多个
publicstaticfuncdecode(_type:T.Type, array: [[String:Any]]) -> [T]?whereT:Decodable{
ifletdata =self.getJsonData(with: array){
ifletmodels =try?JSONDecoder().decode([T].self, from: data){
returnmodels
}
}else{
print("模型转换->转换data失败")
}
returnnil
}
privatestaticfuncgetJsonData(with param:Any)->Data?{
if !JSONSerialization.isValidJSONObject(param) {
returnnil
}
guardletdata =try?JSONSerialization.data(withJSONObject: param, options: [])else{
returnnil
}
returndata
}
}
//模型转字典,或转json字符串
structLsqEncoder {
publicstaticfuncencoder(toString model:T) ->String?whereT:Encodable{
letencoder =JSONEncoder()
encoder.outputFormatting = .prettyPrinted
guardletdata =try? encoder.encode(model)else{
returnnil
}
guardletjsonStr =String(data: data, encoding: .utf8)else{
returnnil
}
returnjsonStr
}
publicstaticfuncencoder(toDictionary model:T) ->[String:Any]?whereT:Encodable{
letencoder =JSONEncoder()
encoder.outputFormatting = .prettyPrinted
guardletdata =try? encoder.encode(model)else{
returnnil
}
guardletdict =try?JSONSerialization.jsonObject(with: data, options: .mutableLeaves)as? [String:Any]else{
returnnil
}
returndict
}
}