本文告诉大家多个方法转换 short 和 byte 有简单的也有快的 快速简单的方法 static short ToShort(short byte1, short byte2) { return...byte byte1, out byte byte2) { byte2 = (byte) (number >> 8); byte1 = (byte) (number & 255); } 简单的方法...通过BitConverter 可以将大量的类转换为 byte 包括 short 的方法 short number = 42; byte[] numberBytes = BitConverter.GetBytes...(number); short converted = BitConverter.ToInt16(numberBytes); 但是为了这么简单的 short 两个 byte 创建一个数组,感觉不是很好...,同时有更好的阅读体验。
全然不同(起初很分散)是Obj-C函数的调用方法,类似通常的C-ish方式,比如NSLog(@“我的日志消息”);但也有Obj-C语法对象的调用方法。...相反Qt你想信号/插槽,你仅仅用QObject类,而Obj-c这里你用NSObject做不论什么事情....据我所知:您能够使用intValue NSNumber或者NSString方法等转换为int类型。...谈到线程:你能够通过使用NSObject 的performSelectorInBackground实现主要的并发性。它使一个方法在后台线程中执行。...对于简单的sax风格的解析,至少有NSXMLParser能够对付。
好了,废话不多说,直接上代码,let's go 简单字典转模型 首先,从最简单的字典开始,例如我们需要将如下的字典转化成自定义的模型。...当我们想要使用字典转模型功能的时候,提供一个类方法方便转换,该方法放在NSObject+ScottKeyValue分类中,该分类负责字典转模型的方法实现。...接下来,我们拿到值后将值的类型转换为属性对应的数据类型。...到这里最简单的字典转模型大致完成了,当然还有很多的细节没有完善,后面再做处理。...字典数组转模型 稍微复杂的一种情况是一个字典里面带有数组: NSDictionary *dict = @{ @"statuses" : @[
但是,一些简单的数据,我们也可以尝试自己来实现转换的过程。 更重要的是,有时候在iOS面试的时候,部分面试官会不仅问你某种场景会用到什么框架,更会问你如果要你来实现这个功能,你有没有解决思路?...字典转模型:KVC 当对象的属性很多的时候,我们可以利用KVC批量设置。...解决:重写对象的setValue:forUndefinedKey:,把系统的方法覆盖, 就能继续使用KVC,字典转模型了。...字典转模型:Runtime 思路1:利用运行时,首先要遍历参数字典, 如果我们获取得属性列表中包含了字典中的 key,就利用 KVC 方法赋值,然后就完成了字典转模型的操作。...这是因为,从字典遍历出来的key无法得知自定义类型的属性的类名。
模型 概念 专门用来存放数据的对象 特点 一般直接继承自NSObject 在.h文件中声明一些用来存放数据的属性 首先创建实体类,具备属性,可用点语法 模型定义示例 @interface Shop...*/ + (instancetype)shopWithDict:(NSDictionary *)dict; @end 字典转模型示例 ```objc (instancetype)initWithDict...NSString *file = [[NSBundle mainBundle] pathForResource:@"shops.plist" ofType:nil]; // 从plist...文件中加载一个数组对象(这个数组中存放的都是NSDictionary对象) NSArray *dictArray = [NSArray arrayWithContentsOfFile:file...]; // 将 “字典数组” 转换为 “模型数据” for (NSDictionary *dict in dictArray) { // 遍历每一个字典
,通过这个编码就能辨别这些成员变量、属性、方法的数据类型(也包括属性修饰符、方法修饰符等)。...这么做的目的,就是为了 json 转模型的时候,同样把父类的属性名作为映射的 key。...,作者此处尝试将协议名转换为类,若转换成功,则说明该容器类型属性的元素类型是该协议同名的类。...具体代码不贴了,主要是根据之前的一些辅助的类,利用 objc_msgSend 给目标数据 model 发送属性的 setter 方法。代码看起来复杂,实际上很简单。...八、从入口函数说起 回到开头,有几个方法是经常使用的(当然包括 NSArray 和 NSDictionary 中的延展方法): + (nullable instancetype)yy_modelWithJSON
比如我们创建了一个对象 [[NSObject alloc]init],最终被转换为几万行代码,截取最关键的一句可以看到底层是通过runtime创建的对象 ?...method_exchangeImplementations(Method m1 , Method m2) 案例1:方法简单的交换 创建一个Person类,类中实现以下两个类方法,并在.h 文件中声明...[type hasPrefix:@"NS"]) { // 将对象名转换为对象的类型,将新的对象字典转模型(递归) Class...JSON数据 我们既然能获取到属性类型,那就可以拦截到模型的那个数组属性,进而对数组中每个模型遍历并字典转模型,但是我们不知道数组中的模型都是什么类型,我们可以声明一个方法,该方法目的不是让其调用,而是让其实现并返回模型的类型...[type hasPrefix:@"NS"]) { // 将对象名转换为对象的类型,将新的对象字典转模型(递归) Class
]; } 步骤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> @
比如我们创建了一个对象 [[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
本文举例说明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
下面来看看简单的实现方式。...注意,下面的代码我换了一个方法名(不然会覆盖系统原来的方法!),加了一个忽略属性方法是否被实现的判断,并加上了对父类属性的归解档循环。...以往我们都是利用KVC进行字典转模型,但是它还是有一定的局限性,例如:模型属性和键值对对应不上会crash(虽然可以重写setValue:forUndefinedKey:方法防止报错),模型属性是一个对象或者数组时不好处理等问题...,进而对数组中每个模型遍历并字典转模型,但是我们不知道数组中的模型都是什么类型,我们可以声明一个方法,该方法目的不是让其调用,而是让其实现并返回模型的类型。...[type hasPrefix:@"NS"]) { // 将对象名转换为对象的类型,将新的对象字典转模型(递归) Class class
获取类详细属性、方法简述 在苹果官方为我们提供的类中,只能获取一小部分公开的属性和方法。有些我们恰好需要的属性和方法,可能会被官方隐藏了起来,没有直接提供给我们。...NSObject+XXModel.h、NSObject+XXModel.m 就是我们用来解决字典转模型所创建的分类,协议中的 + (NSDictionary *)modelContainerPropertyGenericClass...// XXModel 协议 @protocol XXModel NSObject> @optional // 协议方法:返回一个字典,表明特殊字段的处理规则 + (nullable NSDictionary...// 判断当前类是否实现了协议方法,获取协议方法中规定的特殊属性的处理方式 NSDictionary *perpertyTypeDic; if([self...但是如果数据模型中有多个属性的话,我们不得不对每个属性进行处理,这个过程非常繁琐。 这里我们可以参考之前『字典转模型』 的代码。通过 Runtime 获取类的属性列表,实现自动归档和解档。
每一个方法都默认带有两个隐式参数 self : 方法调用者 _cmd : 调用方法的标号,可以写也可以不写。...RunTime字典转模型 为了方便以后重用,这里通过给NSObject添加分类,声明并实现使用RunTime字典转模型的类方法。...+ (instancetype)modelWithDict:(NSDictionary *)dict 首先来看一下KVC字典转模型和RunTime字典转模型的区别 KVC:KVC字典转模型实现原理是遍历字典中所有...RunTime字典转模型的二级转换 在开发过程中经常用到模型嵌套,也就是模型中还有一个模型,这里尝试用RunTime进行模型的二级转换,实现思路其实比较简单清晰。...而当成员属性类型就是NSDictionary的话就表明,我们本就想让成员属性是一个字典,不需要进行模型的转换。
使用方法: 简单的 Model 与 JSON 相互转换 // JSON: { "uid":123456, "name":"Harry", "created":"1965-07-31T00...转换为 Model: User *user = [User yy_modelWithJSON:json]; // 将 Model 转换为 JSON 对象: NSDictionary *json = [...如果一个属性没有映射关系,那默认会使用相同属性名作为映射。 在 json->model 的过程中:如果一个属性对应了多个 json key,那么转换过程会按顺序查找,并使用第一个不为空的值。...,则处理过程中会忽略该列表内的所有属性 + (NSArray *)modelPropertyBlacklist { return @[@"test1", @"test2"]; } // 如果实现了该方法...,则处理过程中不会处理该列表外的属性。
在开发中,经常使用到模型,通常做法就是字典转模型 字典转模型的过程最好封装在模型内部 模型应该提供一个可以传入字典参数的构造方法 - (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
不得不承认KVC在开发过程中是神器一般的存在。如果正确灵活使用kvc,会使得整个开发过程轻松很多。简单而强大。...KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVC操作。它提供一种机制来间接访问对象的属性。...:] 直接赋值 支持键值路径 支持操作符 字典转模型 修改UI私有属性 直接赋值 对于属性值我们可以通过setter 和getter方法,或读取或写入数值。...@avg: 把集合中的每个对象都转换为double类型,返回一个值为平均值的NSNumber对象。 @max: 使用compare:方法来确定最大值。...可见,只要写好实现,完全可以自定义一些比较有用的Collection Operators 字典转模型 下面是常见的使用方法,目前有很多KVC 和 Runtime一起使用达到Json数据自动转模型的方法,
完整版代码可以在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
先承认我是标题党,因为在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派生出的所有类,都只是在遵守一个或多个协议而已。
防止内容再次被锁定...所有东西都在这里面 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
领取专属 10元无门槛券
手把手带您无忧上云