IOS反射,swift反射,基础 MODEL转字典,字典转MODEL,根据下面的自己进行拓展

/ Mac / 没有评论 / 1697浏览

IOS反射,swift反射,基础 MODEL转字典,字典转MODEL,根据下面的自己进行拓展

首先介绍一下Swift中的反射,在2.0中做了一定的修改,要获取它的运行时(Reflect),要对这个实例化对象调用Mirror方法比如:

class Dog{
  var name = string()
  var id = string()
}
let dogSmall = Dog()//实例化
var dogMirror = Mirror(reflecting:dogSmall)//获取这个dogsmall的反射信息

通过上面的方法,我们获取到了在运行时候实例dogsmall的一些信息,包括他有哪些值,以及这些数值对应的value。那么我们接下来就要给他做出循环,children就是这个 对象的属性-值 的一个数组,每一对是一个元组(label,value)

for eachItem in dogMirror.children {
  let (label name,value) = eachItem
}

我们可以利用这个方法来将一个对象,转换成一个字典。代码示例:自己看吧、

class ReflectMrshan:NSObject{
  /**
  对象转换为字典,首先先打印出来,待会在实现STRING-DIC
  - parameter model: 对象
  - returns: 转化出来的字典
  */
  class func ModelToDic(model:AnyObject)->NSDictionary{
    let redic = NSMutableDictionary()
    let mirror: Mirror = Mirror(reflecting: model)
    for p in mirror.children{
      if(p.label! != ""){
        redic.setValue("\(p.value)", forKey: p.label!)
      }
    }
    return redic
  }
  /**
  字典转换为对象(最基础方法,循环嵌套,作对象数组,以及对象中的对象转换)
  - parameter dic:   字典
  - parameter model: 需要赋值的对象的实例
  */
  class func DicToModel(dic:Dictionary<String,String>,model:NSObject){
    /// 这里将字典中所有KEY  和 值  都转换为  STRING类型,目的只有一个运用 OBJ的 setValue方法,给 这个对象赋值
    /// 这就完成了,字典和对象的转换
    let mirrotwo:Mirror = Mirror(reflecting: dic)
    for p in mirrotwo.children {
      var (key,value) = (p.value as! (String,String))
      //循环出字典中的每一对key - value 都是String类型,然后将这个类型赋值给model
      //这一次遍历当前需要赋值对象的属性,是因为需要判断当前对象是否有这个属性,如果有才会给他赋值,如果没有就略过
      //mirrorModel是当前需要赋值的对象的反射对象,他的LABEL就是对象的属性,value就是数值,但是只读的,
      //所以只能通过model.setValue来赋值
      let mirrorModel = Mirror(reflecting: model)
      for eachItem in mirrorModel.children {
        if(eachItem.label! == key){
          //这一步简直爆炸的方法
          model.setValue(value, forKey: key)
        }
      }
    }
  }
  /**
  这个方法还没有实现
  这个方法是将对象转换为JSON字符串
  - parameter model: 需要处理的对象
  - returns: JOSN字符串
  */
  class func ModelToJson(model:NSObject)->String{
    let redic:NSString = ""
    let mirror: Mirror = Mirror(reflecting: model)
    for p in mirror.children{
      if(p.label! != ""){
        //print("\(p.label!)" + "___的数值是___" + "\(p.value)")
        redic.stringByAppendingString("\(p.label),\(p.label!)")
      }
    }
    return redic as String
  }
}
/// 一个测试类
class user:ReflectMrshan{
  var id:String!
  var name:String!
  var haha:String!
}

调用:

//这里是字典和对象的相互转换
let testModel = user()
user.DicToModel(["id":"no2","name":"missliu","haha":"god","last":"xixi"], model: testModel)//字典转对象
var redic = user.ModelToDic(testModel)//对象转字典