用KVC获取数组最值/平均值/获取批量返回值等

开发中获取数组中最大/最小值会先进行排序再取值.
获取数组的平均值会求和取平均,略显麻烦.
其实iOS中可以利用KVC实现, 还可以批量调用方法,批量获取返回值.

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"];

可以看出, KVC可以做到让元素依次调用某方法并将返回值放入新的数组返回. 系统的方法可以如此调用,猜想自定义方法也可行, 验证如下:

// 在 NSNumber 分类中扩展一个判断正负的方法
@implementation NSNumber (Extension)
- (BOOL)isPositiveNumber {
    if ([self floatValue] > 0) return YES;
    else return NO;
}

// 用 NSNumber 数组检验
NSArray *numArray = [NSArray arrayWithObjects:@1.2, @(-2.1), @(10), 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, 值: 1
2016-09-17 20:41:40.204 Test [2957:502894] 第2个元素类型: __NSCFBoolean, 值: 0
2016-09-17 20:41:40.205 Test [2957:502894] 第3个元素类型: __NSCFBoolean, 值: 1

返回值是BOOL类型, 结果正、负、正, 验证正确.
这个特性值得利用到程序的设计中去,想想都觉得能玩出很多"花样"来.


觉得有用的猿友们点个赞喽.

你可能感兴趣的:(用KVC获取数组最值/平均值/获取批量返回值等)