澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-05-01 05:58 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

【澳门威尼娱乐网址】用KVC获取数组最值,KVO原

// 在 NSNumber 分类中扩展一个判断正负的方法@implementation NSNumber (Extension)- isPositiveNumber { if ([self floatValue] > 0) return YES; else return NO;}// 用 NSNumber 数组检验NSArray *numArray = [NSArray arrayWithObjects:@1.2, @, @, nil];NSArray *reuslts = [numArray valueForKeyPath:@"isPositiveNumber"];for (int i = 0; i < reuslts.count; i  ) { NSLog(@"第%d个元素类型: %@, 值: %@", i   1, [reuslts[i] class],reuslts[i]);}打印结果:2016-09-17 20:41:40.204 Test [2957:502894] 第1个元素类型: __NSCFBoolean, 值: 12016-09-17 20:41:40.204 Test [2957:502894] 第2个元素类型: __NSCFBoolean, 值: 02016-09-17 20:41:40.205 Test [2957:502894] 第3个元素类型: __NSCFBoolean, 值: 1

重复运维,就从未有过面前蒙受通报了,表达我们未来需求活动触发通告。嗯,一看文书档案就了然,在校勘name的值的时候,大家只须求调用一下那多个主意就OK了。

支付中赢得数组中最大/最小值会先举办排序再取值.获取数组的平均值会求和取平均,略显麻烦.其实iOS中能够接纳KVC达成, 还足以批量调用方法,批量获取重临值.

2017-10-30 21:41:55.337456 0800 KVCDemo[4468:2142554] setName2017-10-30 21:41:55.337686 0800 KVCDemo[4468:2142554] p.name:
NSArray *array = [NSArray arrayWithObjects:@"1.2",@"2.1", @"4.9", nil];// 最大值CGFloat maxFloat = [[array valueForKeyPath:@"@max.floatValue"] floatValue];// 最小值CGFloat minFloat = [[array valueForKeyPath:@"@min.floatValue"] floatValue];// 平均值CGFloat avg = [[array valueForKeyPath:@"@avg.floatValue"] floatValue];// 转为int类型后再转为string类型NSArray *resultArray = [array valueForKeyPath:@"intValue.stringValue"];// 转为int类型后再转为string类型再求每个string的长度NSArray *lengthArray = [array valueForKeyPath:@"intValue.stringValue.length"];NSArray *stringArray = [NSArray arrayWithObjects:@"NameS",@"CHEN", @"WoShiShui", nil];// string数组转大写NSArray *resultArray = [stringArray valueForKeyPath:@"uppercaseString"];
  • 第1层模型:种种属性与辞书对应
  • Status.h

而是它是怎么进展安装的吧?注释掉name属性,并累计一个_name变量

感到可行的猿友们点个赞喽.

//空的方法体也行- setValue:value forUndefinedKey:(NSString *)key{}

长期以来开启自动触发文告,然后我们打字与印刷一下p的档次,那时候美妙的专门的学业发生了

再次回到值是BOOL类型, 结果正、负、正, 验证正确.这几个性格值得利用到程序的宏图中去,动脑筋都认为能玩出非常多"花样"来.

#import <Foundation/Foundation.h>@interface PersonModel : NSObject@property (nonatomic, copy) NSString *iconStr;@property (nonatomic, copy) NSString *showStr;@end

出口如下:

能够看看, KVC能够产生让要素依次调用某艺术并将重临值归入新的数组重回. 系统的措施能够如此调用,估摸自定义方法也平价, 验证如下:

  • 落到实惩处类:NSObject EnumArr.m
@implementation Person{ NSString *_name;}  accessInstanceVariablesDirectly{ return NO;}

关于实现路线,能够提供二个NSObject分类,特意词典转模型,现在全体模型都得以经过这一个分类转。

2017-10-31 10:46:16.945467 0800 KVCDemo[5575:2686904] setName
  • 第2层模型:第2层模型作为第一层模型的数组类型的天性
  • CellModel.h

此处解释一下这几个kind的值,kind其实便是叁个枚举值

  • 调用

测试

澳门威尼娱乐网址 1

//Person.m- setName:(NSString *)name{ NSLog(@"setName");}

本文实验德姆o传送门:DictToModel德姆o

有人或者会想到用KVC,直接[self setValue:name forKey:@"name"];,注意这里明显是不得以向来用KVC的,因为子类这里重写了set方法,使用KVC它必然会走子类的set方法,然后重新调用。

#import <Foundation/Foundation.h>@interface GloryListModel : NSObject//图标@property (nonatomic, copy) NSString *icon;//标题@property (nonatomic, copy) NSString *title;//目标控制器@property (nonatomic, copy) NSString *targetVC;//菜单编号@property (nonatomic, copy) NSString *menuCode;  (instancetype)gloryListModelWithDict:(NSDictionary *)dict;  (NSArray<GloryListModel *> *)gloryListModelsWithPlistName:(NSString *)plistName;@end

OK,大功告成。当然,这里自身实际是囤积居奇啊,系统相对不是那般做的,系统增添的子类应该要复杂得多,因为直至获取文告,被阅览者的isa指针如故指向子类,而笔者辈这里早就将被观望者得指针指回了父类。这里实在仍然得以用关联对象,只可是还得重写一下get方法,具体作者就不再多讲了,runtime能做的事太多,只要用观念考,方法依然无数的。

  • 达成文件

这一个方法的再次回到值决定是还是不是自动触发布告,校勘代码

//NSObject KVO.m#import "NSObject KVO.h"@implementation NSObject - HK_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:context{ //动态创建子类 NSString *oldClassName = NSStringFromClass([self class]); NSString *newClassName = [@"HKKVO_" stringByAppendingString:oldClassName]; Class newClass = objc_allocateClassPair([self class], newClassName.UTF8String, 0); //三个参数分别为superClass,className,第三个参数默认填0 //重写set方法 IMP imp = method_getImplementation(class_getClassMethod([self class], @selector)); class_addMethod(newClass, @selector, imp, "v@:@"); //注册该类 objc_registerClassPair; //改变被观察者的isa指针 object_setClass(self, newClass);}- setName:(NSString *)name{ NSLog(@"setName");}
- setValue:value forUndefinedKey:(NSString *)key{}
2017-10-30 21:30:09.808609 0800 KVCDemo[4365:2098502] p.name:name

更注重的是,有的时候候在iOS面试的时候,部分面试官会不仅仅问你某种场景会用到哪些框架,更会问您要是要你来兑现这几个职能,你有未有解决思路?所以,自个儿达成辞书转模型如故有供给明白的。有了那么些根底,在行使运营时runtime的动态性子,你也能够达成那几个第三方框架。

2017-10-30 22:05:42.022347 0800 KVCDemo[4651:2227632] max:302017-10-30 22:05:42.022524 0800 KVCDemo[4651:2227632] min:102017-10-30 22:05:42.025358 0800 KVCDemo[4651:2227632] sum:602017-10-30 22:05:42.025716 0800 KVCDemo[4651:2227632] avg:20
  • Status.m

再度运行,通知成功触发

#import "NSObject EnumDict.h"//导入模型#import "Status.h"#import <objc/runtime.h>@implementation NSObject const char *kCMPropertyListKey = "CMPropertyListKey";  (instancetype)cm_modelWithDict:(NSDictionary *)dict{ /* 实例化对象 */ id model = [[self alloc]init]; /* 使用字典,设置对象信息 */ /* 1. 获得 self 的属性列表 */ NSArray *propertyList = [self cm_objcProperties]; /* 2. 遍历字典 */ [dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { /* 3. 判断 key 是否字 propertyList 中 */ if ([propertyList containsObject:key]) { // 获取成员属性类型 // 类型经常变,抽出来 NSString *ivarType; if ([obj isKindOfClass:NSClassFromString(@"__NSCFString")]) { ivarType = @"NSString"; }else if ([obj isKindOfClass:NSClassFromString(@"__NSCFArray")]){ ivarType = @"NSArray"; }else if ([obj isKindOfClass:NSClassFromString(@"__NSCFNumber")]){ ivarType = @"int"; }else if ([obj isKindOfClass:NSClassFromString(@"__NSCFDictionary")]){ ivarType = @"NSDictionary"; } // 二级转换,字典中还有字典,也需要把对应字典转换成模型 // 判断下value,是不是字典 if ([obj isKindOfClass:NSClassFromString(@"__NSCFDictionary")]) { // 是字典对象,并且属性名对应类型是自定义类型 // value:user字典 -> User模型 // 获取模型类对象 NSString *ivarType = [Status dictWithModelClass][key]; Class modalClass = NSClassFromString; // 字典转模型 if (modalClass) { // 字典转模型 user obj = [modalClass cm_modelWithDict:obj]; } } // 三级转换:NSArray中也是字典,把数组中的字典转换成模型. // 判断值是否是数组 if ([obj isKindOfClass:[NSArray class]]) { // 判断对应类有没有实现字典数组转模型数组的协议 if ([self respondsToSelector:@selector(arrayContainModelClass)]) { // 转换成id类型,就能调用任何对象的方法 id idSelf = self; // 获取数组中字典对应的模型 NSString *type = [idSelf arrayContainModelClass][key]; // 生成模型 Class classModel = NSClassFromString; NSMutableArray *arrM = [NSMutableArray array]; // 遍历字典数组,生成模型数组 for (NSDictionary *dict in obj) { // 字典转模型 id model = [classModel cm_modelWithDict:dict]; [arrM addObject:model]; } // 把模型数组赋值给value obj = arrM; } } // KVC字典转模型 if  { /* 说明属性存在,可以使用 KVC 设置数值 */ [model setValue:obj forKey:key]; } } }]; /* 返回对象 */ return model;}
typedef NS_ENUM(NSUInteger, NSKeyValueSetMutationKind) { NSKeyValueUnionSetMutation = 1, NSKeyValueMinusSetMutation = 2, NSKeyValueIntersectSetMutation = 3, NSKeyValueSetSetMutation = 4};

当对象的本性超多的时候,我们得以行使KVC批量设置。

- viewDidLoad { [super viewDidLoad]; Person *p = [Person new]; [p HK_addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; p.name = @"change";}
  • 第2层模型:第2层模型作为第一层模型的自定义类的天性
  • PersonModel.h
NSLog(@"%@",p.name);2017-10-31 11:09:42.445267 0800 KVCDemo[5700:2752840] 
  • 第1层模型:实现公文须要指明数组里面装的类名
  • Status.m

对于集合类KVC有一对藏匿方法,如:

需求:有多少个排名列表页面,这几个页面包车型客车各类排名对应叁个模子,这些模型从Plist转换得到。那么完成的代码如下所示:

- setName:(NSString *)name{ NSObject *obj = objc_getAssociatedObject(self, @"observer"); [obj observeValueForKeyPath:@"name" ofObject:self change:@{@"kind":@(NSKeyValueUnionSetMutation),@"new":name} context:nil]; NSLog(@"setName"); Class superClass = [self superclass]; object_setClass(self, superClass); [self setValue:name forKey:@"name"];}

唯独KVC批量转的时候,有个沉重的弱点,就是当词典中的键,在对象属性中找不到对应的性质的时候会报错。化解办法是兑现上边包车型地铁方法:

- HK_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:context{ //动态创建子类 NSString *oldClassName = NSStringFromClass([self class]); NSString *newClassName = [@"HKKVO_" stringByAppendingString:oldClassName]; Class newClass = objc_allocateClassPair([self class], newClassName.UTF8String, 0); //三个参数分别为superClass,className,第三个参数默认填0 //重写set方法 IMP imp = method_getImplementation(class_getClassMethod([self class], @selector)); class_addMethod(newClass, @selector, imp, "v@:@"); //注册该类 objc_registerClassPair; //改变被观察者的isa指针 object_setClass(self, newClass); objc_setAssociatedObject(self, @"observer", observer, OBJC_ASSOCIATION_RETAIN);}- setName:(NSString *)name{ NSObject *obj = objc_getAssociatedObject(self, @"observer"); [obj observeValueForKeyPath:@"name" ofObject:self change:@{@"kind":@(NSKeyValueUnionSetMutation),@"new":name} context:nil]; NSLog(@"setName");}

本文由澳门威利斯人发布于办公软件,转载请注明出处:【澳门威尼娱乐网址】用KVC获取数组最值,KVO原

关键词: 澳门威利斯人 平均值 数组 批量 模型