iOS 基于块的遍历方式

数组



    
        NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
        
        [iosArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            NSLog(@"%@", obj);
            
            if ([obj isEqualToString:@"E"]) {
                
                *stop = YES;
                
            }
            
        }];

若已知collection里对象的数据类型,可以修改块签名,知道对象的精确类型后,编译器就可以检测开发者是否调用了该对象所不具有的方法,并在发现问题时报错。

字典


        
        NSDictionary *dict = @{@"1":@"11", @"2":@"22", @"3":@"33"};
        
        [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            
            NSLog(@"%@", obj);
            
            if ([obj isEqualToString:@"22"]) {
                
                *stop = YES;
                
            }
            
        }];

反向遍历

        NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
        
        [iosArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            NSLog(@"%@", obj);
            
            if ([obj isEqualToString:@"E"]) {
                
                *stop = YES;
                
            }
            
        }];

并发遍历


        NSArray *iosArray = @[@"L", @"O", @"V", @"E", @"I", @"O", @"S"];
        
        NSMutableArray *iosMutableArray = [NSMutableArray arrayWithArray:iosArray];
        
        [iosMutableArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            obj = [NSString stringWithFormat:@"_%@", obj];
            
            [iosMutableArray replaceObjectAtIndex:idx withObject:obj];
            
            NSLog(@"%@", obj);
            
            if ([obj isEqualToString:@"_I"]) {
                
                *stop = YES;
                
            }
            
        }];

使用反向遍历,反向遍历删除元素后不会导致崩溃。
这里使用了block,需要注意在block里容易引起的保留环问题,比如使用self调用方法时,把self转化成若引用即可打破保留环。如:__weak __typeof(self)weakSelf = self或者 __weak MyController *weakSelf = self;在block里使用weakSelf即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容