首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从带有属性的NSObject转换为NSDictionary的Obj-C简单方法?

从带有属性的NSObject转换为NSDictionary的Obj-C简单方法:

以下是一个简单的Obj-C方法,可以将带有属性的NSObject对象转换为NSDictionary对象。

代码语言:objc
复制
- (NSDictionary *)dictionaryWithObject:(NSObject *)object {
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([object class], &outCount);
    NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:outCount];
    
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
        id propertyValue = [object valueForKey:propertyName];
        if (propertyValue) {
            [result setObject:propertyValue forKey:propertyName];
        }
    }
    
    free(properties);
    return result;
}

使用方法:

代码语言:objc
复制
// 假设有一个名为MyObject的NSObject子类,带有属性name和age
MyObject *myObject = [[MyObject alloc] init];
myObject.name = @"John";
myObject.age = 30;

NSDictionary *dictionary = [self dictionaryWithObject:myObject];
NSLog(@"%@", dictionary);

输出结果:

代码语言:txt
复制
{
    age = 30;
    name = John;
}

这个方法会遍历对象的所有属性,将属性名作为键,属性值作为值,存储到一个NSMutableDictionary中。最后返回这个字典。

注意:这个方法仅适用于具有属性的NSObject对象,不适用于其他类型的对象。在使用时,请确保传递的对象具有属性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

但是,一些简单数据,我们也可以尝试自己来实现转换过程。 更重要是,有时候在iOS面试时候,部分面试官会不仅问你某种场景会用到什么框架,更会问你如果要你来实现这个功能,你有没有解决思路?...字典模型:KVC 当对象属性很多时候,我们可以利用KVC批量设置。...解决:重写对象setValue:forUndefinedKey:,把系统方法覆盖, 就能继续使用KVC,字典模型了。...字典模型:Runtime 思路1:利用运行时,首先要遍历参数字典, 如果我们获取得属性列表中包含了字典中 key,就利用 KVC 方法赋值,然后就完成了字典模型操作。...这是因为,字典遍历出来key无法得知自定义类型属性类名。

2.5K10

YYModel 源码剖析:关注性能

,通过这个编码就能辨别这些成员变量、属性方法数据类型(也包括属性修饰符、方法修饰符等)。...这么做目的,就是为了 json 模型时候,同样把父类属性名作为映射 key。...,作者此处尝试将协议名转换为类,若转换成功,则说明该容器类型属性元素类型是该协议同名类。...具体代码不贴了,主要是根据之前一些辅助类,利用 objc_msgSend 给目标数据 model 发送属性 setter 方法。代码看起来复杂,实际上很简单。...八、入口函数说起 回到开头,有几个方法是经常使用(当然包括 NSArray 和 NSDictionary延展方法): + (nullable instancetype)yy_modelWithJSON

2K80

OC最实用runtime总结,面试、工作你看我就足够了!前言什么是runtime?如何应用运行时?

比如我们创建了一个对象 [[NSObject alloc]init],最终被转换为几万行代码,截取最关键一句可以看到底层是通过runtime创建对象 ?...method_exchangeImplementations(Method m1 , Method m2) 案例1:方法简单交换 创建一个Person类,类中实现以下两个类方法,并在.h 文件中声明...[type hasPrefix:@"NS"]) { // 将对象名转换为对象类型,将新对象字典模型(递归) Class...JSON数据 我们既然能获取到属性类型,那就可以拦截到模型那个数组属性,进而对数组中每个模型遍历并字典模型,但是我们不知道数组中模型都是什么类型,我们可以声明一个方法,该方法目的不是让其调用,而是让其实现并返回模型类型...[type hasPrefix:@"NS"]) { // 将对象名转换为对象类型,将新对象字典模型(递归) Class

1.3K120

iOS运行时Runtime应用

]; } 步骤2:在UIFont分类中拦截系统方法,将其替换为我们自定义方法,代码如下: //load方法不需要手动调用,iOS会在应用程序启动时候自动调起load方法,而且执行时间较早,所以在此方法中执行交换操作比较合适...@param object 哪个对象中获取关联属性 @param key 关联属性对应key @return 返回关联属性值 */ id _Nullable objc_getAssociatedObject....png 现在,我们使用Runtime来实现字典模型操作,大致思路是这样: 借助Runtime可以动态获取成员列表特性,遍历模型中所有属性,然后以获取到属性名为key,在JSON字典中寻找对应值...: 步骤1:创建NSObject类目NSObject+ZSModel,用于实现字典模型 @interface NSObject (ZSModel) + (instancetype)zs_modelWithDictionary...:(NSDictionary *)dictionary; @end //ZSModel协议,协议方法可以返回一个字典,表明特殊字段处理规则 @protocol ZSModel @

1.3K20

OC史上最实用runtime总结,面试、工作你看我就足够了

比如我们创建了一个对象 [[NSObject alloc]init],最终被转换为几万行代码,截取最关键一句可以看到底层是通过runtime创建对象 .cpp 文件 删除掉一些强制转换语句,可以看到调用方法本质就是发消息...method_exchangeImplementations(Method m1 , Method m2) 案例1:方法简单交换 创建一个Person类,类中实现以下两个类方法,并在.h 文件中声明...:方法防止报错),模型属性是一个对象或者数组时不好处理等问题,所以无论是效率还是功能上,利用runtime进行字典模型都是比较好选择。...[type hasPrefix:@"NS"]) { // 将对象名转换为对象类型,将新对象字典模型(递归) Class class = NSClassFromString(type); value...[type hasPrefix:@"NS"]) { // 将对象名转换为对象类型,将新对象字典模型(递归) Class class = NSClassFromString(type); value

1.4K20

iOS_Runtime、method swizzing (俗称黑魔法) 一

本文举例说明Runtime一下几个用途: 1、拦截并替换方法 2、给分类添加属性 3、字典模型 4、动态添加方法,处理一个未实现方法和去除报错 5、动态设置变量值,可设置私有属性 6、实现NSCoding...协议,完成归档和解档 7、获取属性、成员变量、方法(类/实例)、协议 8、添加方法、替换原方法、交换方法 9、动态添加方法 1、在分类为系统方法添加功能 例:输出UIImage imageNamed:...例:给NSObject添加name属性 #import "NSObject+property.h" #import @implementation NSObject...; @end @interface NSObject (arrayContain) + (instancetype)modelWithDict:(NSDictionary *)dict; @end #.../ -------- 字典模型 -------- NSDictionary *friend = @{@"name":@"huhu", @"age":@25}; NSDictionary *dic

35330

RunTime 之其他实践运用

下面来看看简单实现方式。...注意,下面的代码我换了一个方法名(不然会覆盖系统原来方法!),加了一个忽略属性方法是否被实现判断,并加上了对父类属性归解档循环。...以往我们都是利用KVC进行字典模型,但是它还是有一定局限性,例如:模型属性和键值对对应不上会crash(虽然可以重写setValue:forUndefinedKey:方法防止报错),模型属性是一个对象或者数组时不好处理等问题...,进而对数组中每个模型遍历并字典模型,但是我们不知道数组中模型都是什么类型,我们可以声明一个方法,该方法目的不是让其调用,而是让其实现并返回模型类型。...[type hasPrefix:@"NS"]) { // 将对象名转换为对象类型,将新对象字典模型(递归) Class class

92330

iOS 开发:『Runtime』详解(四)获取类详细属性方法

获取类详细属性方法简述 在苹果官方为我们提供类中,只能获取一小部分公开属性方法。有些我们恰好需要属性方法,可能会被官方隐藏了起来,没有直接提供给我们。...NSObject+XXModel.h、NSObject+XXModel.m 就是我们用来解决字典模型所创建分类,协议中 + (NSDictionary *)modelContainerPropertyGenericClass...// XXModel 协议 @protocol XXModel @optional // 协议方法:返回一个字典,表明特殊字段处理规则 + (nullable NSDictionary...// 判断当前类是否实现了协议方法,获取协议方法中规定特殊属性处理方式 NSDictionary *perpertyTypeDic; if([self...但是如果数据模型中有多个属性的话,我们不得不对每个属性进行处理,这个过程非常繁琐。 这里我们可以参考之前『字典模型』 代码。通过 Runtime 获取类属性列表,实现自动归档和解档。

2.8K40

iOS-RunTime,不再只是听说

每一个方法都默认带有两个隐式参数 self : 方法调用者 _cmd : 调用方法标号,可以写也可以不写。...RunTime字典模型 为了方便以后重用,这里通过给NSObject添加分类,声明并实现使用RunTime字典模型方法。...+ (instancetype)modelWithDict:(NSDictionary *)dict 首先来看一下KVC字典模型和RunTime字典模型区别 KVC:KVC字典模型实现原理是遍历字典中所有...RunTime字典模型二级转换 在开发过程中经常用到模型嵌套,也就是模型中还有一个模型,这里尝试用RunTime进行模型二级转换,实现思路其实比较简单清晰。...而当成员属性类型就是NSDictionary的话就表明,我们本就想让成员属性是一个字典,不需要进行模型转换。

1.3K70

objective-C中接口与泛型

先承认我是标题党,因为在obj-c世界中,官方根本没有"接口"与"泛型"这样说法。 不过在obj-c中有二个与之接近概念"非正式协议(interface)"与"正式协议(protocol)"。...: NSObject { } -(void) HelloWorld; @end 它表明Sample类中,约定了"应该"有一个名为HelloWorld方法(注:我这里说是应该,而不是必须),它只是一种君子协定...这就是obj-c协议跟c#中接口不一样地方:在c#中接口是强制必须实现,否则编译这一关就过不了,而obj-c虽然在编译时会警告,但是最终能编译通过。...(不信大家可以把NSObjectIQuery改成其它类interface定义名称试试,编译根本通不过) 此外,obj-C 2.0中对正式协议还做了一些扩展,允许把正式协议中方法标识为...也就是说,在obj-cOO世界中,身为万物之祖NSObject其实也就一个"正式协议”,所以NSObject派生出所有类,都只是在遵守一个或多个协议而已。

2K50

iOS-模型

在开发中,经常使用到模型,通常做法就是字典模型 字典模型过程最好封装在模型内部 模型应该提供一个可以传入字典参数构造方法 - (instancetype)initWithDic:(NSDictionary...*)dic; + (instancetype)xxxWithDic:(NSDictionary *)dic; 使用字典坏处 一般情况下,设置数据和取出数据都使用“字符串类型key”,编写这些key...编辑器没有智能提示,需要手敲 手巧字符串key,key容易写错 key如果写错了,编译器不会有任何 dic[@"name"] = @"Jack"; NSString *name = dic[@"name"]; 字典模型好处...: 降低代码耦合度 模型设置数据和取出数据都是通过它属性属性名如果错了,编译器会报错,因此,保证了数据正确性 在程序中直接使用模型属性操作,提高编码效率 调用方不用关心模型内部任何处理细节...app.name = @"jack"; NSString *name = app.name; @interface ImageData : NSObject @property (nonatomic,strong

11810

编码篇-精析OC史诗级技术之KVC

不得不承认KVC在开发过程中是神器一般存在。如果正确灵活使用kvc,会使得整个开发过程轻松很多。简单而强大。...KVC操作方法由NSKeyValueCoding提供,而他是NSObject类别,也就是说ObjC中几乎所有的对象都支持KVC操作。它提供一种机制来间接访问对象属性。...:] 直接赋值 支持键值路径 支持操作符 字典模型 修改UI私有属性 直接赋值 对于属性值我们可以通过setter 和getter方法,或读取或写入数值。...@avg: 把集合中每个对象都转换为double类型,返回一个值为平均值NSNumber对象。 @max: 使用compare:方法来确定最大值。...可见,只要写好实现,完全可以自定义一些比较有用Collection Operators 字典模型 下面是常见使用方法,目前有很多KVC 和 Runtime一起使用达到Json数据自动模型方法

1.3K20

Runtime应用(一):JsonModel

完整版代码可以在GitHub-JsonToModel下载 一、前言 与后台交互,后台返回数据一般是Json类型,然而我们定义模型一般是继承自NSObject,Json与Model之间转换,第三方工具也有很多...这三个第三方框架测试效率为YYModel>MJExtention>JsonModel 其中JSonModel核心知识点就在于利用Runtime特点来获取属性以及KVC进行赋值,尝试了一下,封装了一个简易版工具...:property_getName(property)]; 以name为keyJson字典里获取值 // Json字典里获取值 id value = [dict objectForKey:key];...dict; } 2、如果字典属性与模型属性不完全相同,则需要匹配一下 解决方案是定义一个Protocol @protocol JSONModelSpecialAttributesProtocol <NSObject...; @end 如果某个Model与字典不一一匹配,则遵循这个协议,将需要配套属性返回即可,在赋值时候,将key现行转换一下 // 某些属性需要重新映射=== NSDictionary

42740

Objective-C plist文件与KVC 使用

防止内容再次被锁定...所有东西都在这里面 welcome~ 个人博客 plist文件是以类似xml形式构造数据,下面我们直接在xcode中创建完成一个plist文件, File-New-File-属性列表...kvc概念简单说下 Key-Value-Coding(KVC)键值编码 我们主要使用是KVC字典模型,将plist文件中数据以数据模型形式读取。...在构造数据模型时应当使用以下方法 直接设置 - (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues...; 下面构造一个StarModel @interface StarModel : NSObject //歌手名 @property(nonatomic,copy)NSString *name; //歌曲名...*)dict; //类方法 + (instancetype)starModelwithDict:(NSDictionary*)dict; @end 下面设置初始化方法,将字典转为模型 @implementation

46720
领券