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

本文介绍了一种模型与模型之间直接赋值的方法,以及如何获取对象的属性名、属性值和方法名。通过Objective-C的运行时API,实现了对象属性的键值对获取,并提供了对象间数据交换的实现。同时,还提供了获取对象方法名的辅助功能,但指出其可能存在的局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//比较懒 最近有时间 研究了下模型与模型直接赋值的方法 此方法不仅适用于模型赋值模型  其还是用于模型赋值 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]()

        if let 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 i in 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 i in 0 ..< keyArr.count

            {

                //取值

                if let  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 i in 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)

    }

    

    

    

    

    

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值