首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

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

    2.6K10

    YYModel 源码剖析:关注性能

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

    2.1K80

    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 ZSModelNSObject> @

    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.5K20

    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

    38630

    RunTime 之其他实践运用

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

    94630

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

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

    2.9K40

    iOS-RunTime,不再只是听说

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

    1.3K70

    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

    13710

    编码篇-精析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应用(一):Json转Model

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

    47240

    objective-C中的接口与泛型

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

    2K50

    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

    50120
    领券