swift 模型转字典(模型嵌套模型)
2019-01-29 本文已影响14人
Sunshine_Boys
swift 4.0版本以后出现了Codable协议。
在Codable基础上进行 以下类型互转的时候遇到: 模型嵌套模型 (模型中包含数组模型的情况) 遇到 转换失败的问题,今天这里做一下笔记(代码没有优化,写的比较粗糙,请海涵)。
-
json -> model
-
model -> joon
-
Model ->Dictionary
-
Dictionary ->Model
-
Dictionary -> json
-
json -> Dictionary
importFoundation
protocolMappable:Codable{
funcmodelMapFinished()
mutatingfuncstructMapFinished()
}
extension Mappable {
//MARK: -- 模型转字典
funcreflectToDict() -> [String:Any] {
/// 循环 递归
///
/// -Parameters:
/// - m: 镜像
/// - isArray: value 的值是否是数组
/// -Returns: 子集 字典
funcforDicFuntion(m:Mirror,isArray:Bool=false) -> [String:Any] {
vardictTemp = [String:Any]()
forcaselet(key?, value)inm.children{
letn =Mirror(reflecting: value)
if(n.displayStyle== .collection) {
vararray = [[String:Any]]()
forindexinn.children{
letx =Mirror(reflecting: index)
array.append(forDicFuntion(m: x,isArray:true))
}
dictTemp[key] = array
}elseif(n.displayStyle== .set|| n.displayStyle== .optional) {
continue
}else{
if(valueisNSNull) {continue;}
if(n.children.count>0){
if(isArray){
dictTemp =forDicFuntion(m: n)
}else{
dictTemp[key] =forDicFuntion(m: n)
}
}else{
dictTemp[key] = value
}
}
}
returndictTemp
}
letmirro =Mirror(reflecting:self)
returnforDicFuntion(m: mirro)
}
}
使用的时候 自建model 遵循Mappable协议 即可。
例子
vardic = zhjModel.reflectToDict()
若有疑问欢迎骚扰