基于块的遍历方式

遍历数组:

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

参数说明:obj表示数组中的元素,idx表示元素的下标,*stop可以控制遍历何时停止,在需要停止时令*stop = YES即可(不要忘记前面的*)。

这种方法清晰明了,数组元素,下标都可直接获取,就连何时停止都很容易实现,break都可以退休了,遍历字典也同样简单。

遍历字典:

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

你没有看错,就是这么简单,block直接把字典的key和value都给我们了,再也不用书写直白而繁琐的代码了。

注意:

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

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

如代码,直接把key和value的类型修改成NSString类型。

反向遍历:

反向遍历也同样方便,调用另外一个方法即可:

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

这个方法相对于正向遍历多了一个枚举类型的参数NSEnumerationReverse,打开这个选项就可以反向遍历了。

并发遍历:

顺着这个枚举类型的参数,就会引出块枚举的另一大优势:并发遍历,参数是:NSEnumerationConcurrent,也就是可以同时遍历collection中的几个元素,具体数量根据系统资源而定。这样会充分利用系统资源,高效快捷的完成collection的遍历,系统底层会通过GCD来处理并发事宜,开发者不需要担心内存和线程,其他方式若要实现高效的并发遍历十分有难度。通过块枚举遍历,改变collection并不会引起崩溃,代码如下:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值