获取对象属性名及对应值 模型与模型直接数据赋值

时间:2022-11-11 19:17:34

//比较懒 最近有时间 研究了下模型与模型直接赋值的方法 此方法不仅适用于模型赋值模型  其还是用于模型赋值 view  view赋值view 即对象赋值对象

思路1、获取对象属性名

2.根据属性名获取key vlaue 并以字典保存

3. 要赋值对象一键赋值 (这边是做的简易版 用的系统的 后面会升级下 获取属性类型 规避同名不同型的赋值闪退问题)

上代码:

import UIKit


class GetObjectPropertyAndFunctionHelper:NSObject {


    /**

     获取对象的所有属性名字

     

     - parameter targetObject: 目标对象

     

     - returns: 属性名字列表

     */

    func getObjectAllKeys(targetObject:AnyObject) ->[String]

    {

        //创建存储属性名字列表

        var propertiesArr:[String] = [String]()

        iflet targetClass = targetObject.classForCoder

        {

            propertiesArr = getClassAllKeys(targetClass)

        }

        

        return propertiesArr

    }

    

    /**

     获取类的所有属性名字

     

     - parameter targetClass: 目标类

     

     - returns: 目标类的所有属性名字这边做一个区分为了方便在不实例化的情况下进行获取属性名

     */

    func getClassAllKeys(targetClass:AnyClass) ->[String]

    {

        //声明计数变量

        var count:UInt32 =0

        //获取属性列表并复制

        let properties = class_copyPropertyList(targetClass, &count)

        //创建存储属性名字列表

        var propertiesArr:[String] = [String]()

        //判断属性名字数量如果没有则传空

        if count >0

        {

            //遍历属性名字

            for iin 0 ..< count

            {

                let propertyName =property_getName(properties[Int(i)])

                //utf8转换名字

                let proName =String.init(UTF8String: propertyName)

                //存储名字

                propertiesArr.append(proName!)

            }

        }

        //释放runtime数组

        free(properties)

        print(propertiesArr)

        print(count)

        return propertiesArr


    }

    

    

    /**

     获取对象所有属性的键值对并以字典形式输出如果为nil则不会输出

     

     - parameter targetObject: 目标对象实例对象

     

     - returns: 对象属性键值字典

     */

    func getObjectAllKeysAndValues(targetObject:AnyObject) -> [String:AnyObject]

    {

        //获取对象的键值则是通过

        

        var infoDic = [String:AnyObject]()

        /// 获取对象的键值

        let keyArr = getObjectAllKeys(targetObject.classForCoder)

        /// 创建值存储

        var valueArr = [AnyObject]()

        //遍历赋值

        if keyArr.count >0

        {

            for iin 0 ..< keyArr.count

            {

                //取值

                iflet  value = targetObject.valueForKey(keyArr[i])

                {

                    //去空

                    if value.isKindOfClass(NSNull.self) ==false

                    {

                        //赋值

                        infoDic.updateValue(value, forKey: keyArr[i])

                    }

                }

                

            }

        }

        print(infoDic)

        //返回过滤后的有数据的字典

        return infoDic

        

    }

    

    /**

     对象对对象赋值将一个对象里面的数据赋值给另一个对象

     

     - parameter sourceObject: 数据对象(模型较多)

     - parameter targetObject: 目标对象 

     */

    func ObjectToObjectExchange(sourceObject:AnyObject,targetObject:AnyObject)

    {

        //创建交换字典

        var sourceDic = [String:AnyObject]()

        //抽取对象数据

        sourceDic = getObjectAllKeysAndValues(sourceObject)

        //赋值对象数据这边暂时是简易方法等有空增加属性类型判断避归相同属性名不同属性类型造成的闪退问题

        targetObject.setValuesForKeysWithDictionary(sourceDic)

        

    }

    

    

    

    /**

     获取对象的方法名

     

     - parameter targetObject: 目标对象

     

     //暂时不清楚有什么用处因为而且这个方法比较鸡肋获取的方法连属性的名字 然后setter方法也算进去了有点乱还有参数个数似乎也不准确先放在这要用到的时候再进行设计

     

     */

    func getObjectMethods(targetObject:AnyObject)

    {

        var methodCount:UInt32 =0

        let methodList =class_copyMethodList(targetObject.classForCoder, &methodCount)

        if methodCount >0

        {

            for iin 0 ..< methodCount

            {

                let method  = methodList[Int(i)]

                let methodName =method_getName(method)

                let argumentCount =method_getNumberOfArguments(method)

                let methodNameStr =sel_getName(methodName)

                let encoding =method_getTypeEncoding(method)

                print("方法名\(String.init(UTF8String: methodNameStr)) 参数个数 \(String.init(UTF8String:"\(argumentCount)")编码方式\(String.init(UTF8String: encoding)\(encoding)")

                

                

            }

        

        

        }

        

        free(methodList)

    }

    

    

    

    

    

}