ios 数组遍历问题

作者: 笨驴爱吃胡萝卜 | 来源:发表于2022-12-07 12:01 被阅读0次

起因

经常处理数据的时候 会遇到这样的问题。
看到其他语言如swift 或者python 都有自己的map filter 的语法,OC却要用for 语句
1.网络请求的数据,需要数组中第几个元素进行计算
2.需要满足部分的元素形成一个新的数组
一般关于这两个问题的反映是用for 数组 ,然后new 一个新的可变数组把符合条件的数据加入到数组中

NSMutableArray *marr = [NSMutableArray array];
for (int i = 0 ; i < array.count; i++) {
        id temp = array[i];
         if(temp 满足条件) {
            [marr addobject:temp]; 
            这个时候 得到了一个满足条件的数组
          }
}

简单的还好,如果涉及很多需要满足条件的计算 ,这样的代码可读性和维护性,都非常的有挑战。

方案一

把for 的语句封装起来

方案二

添加NSArray的Category
*.h 文件


#import <Foundation/Foundation.h>

typedef BOOL(^filterCondition)(id target);
typedef id  (^mapCondition)(id target);

@interface NSArray (Common)

- (NSArray *)reverse;

/// 筛选出所有符合条件的元素
/// @param condition 筛选条件
- (NSArray *)filter:(filterCondition)condition;

/// 筛选出前几个符合条件的元素
/// @param condition 筛选条件
/// @param count 需要的数量
- (NSArray *)filter:(filterCondition)condition theTopServeral:(NSUInteger)count;

/// 筛选出后几个符合条件的元素
/// @param condition 筛选条件
/// @param count 需要的数量
- (NSArray *)filter:(filterCondition)condition theEndServeral:(NSUInteger)count;

/// map遍历
- (NSArray *)map:(mapCondition)condition;
 
@end

*.m 文件


#import "NSArray+Common.h"

@implementation NSArray (Common)

- (NSArray *)reverse {
    return [[[NSMutableArray arrayWithArray:self] reverseObjectEnumerator] allObjects];
}

- (NSArray *)filter:(filterCondition)condition {
    return [self filter:condition needCount:self.count isTopSeveral:YES];
}

- (NSArray *)filter:(filterCondition)condition theTopServeral:(NSUInteger)count {
    return [self filter:condition needCount:count isTopSeveral:YES];
}

- (NSArray *)filter:(filterCondition)condition theEndServeral:(NSUInteger)count {
    return [self filter:condition needCount:count isTopSeveral:NO];
}

- (NSArray *)filter:(filterCondition)condition needCount:(NSUInteger)count isTopSeveral:(BOOL)isTopSeveral {
    if (count < 1) {
        return @[];
    }
    
    NSMutableArray *tmp = [NSMutableArray arrayWithCapacity:self.count];
    [self enumerateObjectsWithOptions:isTopSeveral ? NSEnumerationConcurrent : NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (tmp.count >= count - 1) {
            *stop = YES;
        }
        if (condition(obj)) {
            [tmp addObject:obj];
        }
    }];
    return tmp.copy;
}

- (NSArray *)map:(mapCondition)condition {
    if (!self.count) {
        return self;
    }
    
    NSMutableArray *tmp = [NSMutableArray arrayWithCapacity:self.count];
    [self enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (condition(obj)) {
            [tmp addObject:condition(obj)];
        } else {
            #ifdef DEBUG
            NSString *tipString = [NSString stringWithFormat:@"元素不符合遍历条件,index = %ld, 元素:%@", idx, obj];
            NSAssert(NO, tipString);
            #endif
        }
    }];
    return tmp.copy;
}

@end

代码的核心 一句 就是enumerateObjectsUsingBlock

使用方法

这里的target 是id 类型,可以是网络请求下来的model ,也可以是字符串 int 等类型

直接返回 float

NSArray *arr = @[@"asd",@"bcd3",@"aew",@"zxc",@"123",@"567",@"bnj",@"opi",@"tytreu",@"qwerty",@"12"];
NSArray *sortArray = [arr filter:^BOOL(NSString * target) {
      return target.length > 2;
}];
NSLog(@"print array - %@",sortArray);
NSArray *topSerArr =  [arr filter:^BOOL(NSString * target) { 
      return target.length > 2;
  } theTopServeral:4];
NSLog(@"print tio serveral array - %@",topSerArr);

通过block 的内部条件进行数据筛选,把筛选条件明确的展示在最显眼的位置

总结

这个优化虽然和小,但是一个大型项目恰恰是每一处的优化才带来整体的效率提升。

相关文章

  • ios 数组遍历问题

    起因 经常处理数据的时候 会遇到这样的问题。看到其他语言如swift 或者python 都有自己的map filt...

  • iOS数组遍历删除问题

    数组遍历删除问题 刚好遇到有人问这个问题,因为遍历一次再删除之后会导致数组越界的错误,直接说解决办法吧 用逆序枚举...

  • iOS 数组 NSArray 遍历 懒加载总结

    iOS开发之懒加载 iOS中数组遍历的方法及比较

  • iOS数组遍历

    对于一个数组 1.for循环 2.for in快速枚举 集合中对象数很多的情况下,for in 的遍历速度非常之快...

  • iOS 性能优化

    iOS App 启动性能优化iOS离屏渲染优化(附DEMO) iOS Objective-C 数组遍历的性能及原理...

  • iOS 常用的数据处理

    1. iOS遍历数组的同时删除元素 NSMutableArray*array = [NSMutableArraya...

  • OC中的各种遍历

    OC中的各种遍历 iOS开发中我们经常遇到各种的数据处理,所以就会经常遇到数组遍历 和 字典遍历。但是不同的遍历方...

  • angular2foreach遍历的几种用法

    遍历简单的数组 遍历数组对象 遍历嵌套数组

  • VS常用四种遍历数组的方法

    目录 for 遍历数组 for in 遍历数组 for of 遍历数组 forEach遍历数组 优缺点总结原文:h...

  • Objective-C 数组遍历的性能及原理

    数组的遍历,这个话题貌似没什么好探究的,该怎么遍历就怎么遍历呗!但是如果要回答这些问题:OC数组有哪几种遍历方式?...

网友评论

    本文标题:ios 数组遍历问题

    本文链接:https://www.haomeiwen.com/subject/kfsnfdtx.html