swift2.0中的反射,实现对象 字典相互转换
===========mrshan 2016.1.14
==========================
首先介绍一下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)//对象转字典