您的位置:首页 > 移动开发 > Swift

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

2016-01-14 15:07 477 查看
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)//对象转字典
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息