OC循环方法推荐-块循环遍历(比for循环好用)
时间:2022-07-24
本文章向大家介绍OC循环方法推荐-块循环遍历(比for循环好用),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近在看一本书《Effective OC 2.0》,今天看到有个tip是OC适中循环各自优劣性,作者最终推荐此块循环。
阅读时思考了下块循环是否方便实现内部循环终止外部循环的问题。
于是做了如下验证,代码如下:
1 //
2 // main.m
3 // 块循环最具优势!
4 //
5 // Created by LongMa on 2019/4/3.
6 // Copyright © 2019年. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10
11 int main(int argc, const char * argv[]) {
12 @autoreleasepool {
13 NSMutableArray *lArr1 = [NSMutableArray array];
14 NSMutableArray *lArr2 = [NSMutableArray array];
15 for (int i = 0; i < 10; ++i) {
16 [lArr1 addObject:@(i)];
17 [lArr2 addObject:@(i)];
18 }
19
20 //反向遍历
21 // [lArr1 enumerateObjectsWithOptions:(NSEnumerationReverse)
22 // usingBlock:^( NSNumber* obj, NSUInteger idx, BOOL * _Nonnull stop) {
23 // NSLog(@"%@,ind:%lu", obj,(unsigned long)idx);
24 // if (idx == 90) {
25 // *stop = YES;
26 // }
27 // }];
28
29
30 //思考:里循环能否终止外循环?
31 //A:可以实现!需要差异化小标和停止参数,然后在里层循环对外循环的stopOut进行操作!此时,对内循环stopIn是否操作会决定内循环是否能执行完毕。
32
33 /** 2019-04-03 01:08:30.003134+0800 块循环最具优势![3176:27943] 0,ind:0
34 2019-04-03 01:08:30.004040+0800 块循环最具优势![3176:27943] --0,ind:0
35 2019-04-03 01:08:30.004143+0800 块循环最具优势![3176:27943] --1,ind:1
36 2019-04-03 01:08:30.004679+0800 块循环最具优势![3176:27943] --2,ind:2
37 2019-04-03 01:08:30.004756+0800 块循环最具优势![3176:27943] --3,ind:3
38 2019-04-03 01:08:30.004819+0800 块循环最具优势![3176:27943] --4,ind:4
39 2019-04-03 01:08:30.004881+0800 块循环最具优势![3176:27943] --5,ind:5
40 2019-04-03 01:08:30.004914+0800 块循环最具优势![3176:27943] --6,ind:6
41 2019-04-03 01:08:30.004945+0800 块循环最具优势![3176:27943] --7,ind:7
42 2019-04-03 01:08:30.005036+0800 块循环最具优势![3176:27943] --8,ind:8
43 2019-04-03 01:08:30.005072+0800 块循环最具优势![3176:27943] --9,ind:9 */
44 [lArr1 enumerateObjectsUsingBlock:^( NSNumber* obj, NSUInteger idxOut, BOOL * _Nonnull stopOut) {
45 NSLog(@"%@,ind:%lu", obj,(unsigned long)idxOut);
46
47 if (idxOut == 2) {
48 *stopOut = YES;
49 }
50
51 [lArr2 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idxIn, BOOL * _Nonnull stopIn) {
52 NSLog(@"--%@,ind:%lu", obj,(unsigned long)idxIn);
53 if (idxIn == 3) {
54 *stopOut = YES;
55 }
56 }];
57 }];
58
59 /** 2019-04-03 01:05:20.987109+0800 块循环最具优势![3020:25596] 0,ind:0
60 2019-04-03 01:05:20.987380+0800 块循环最具优势![3020:25596] --0,ind:0
61 2019-04-03 01:05:20.987427+0800 块循环最具优势![3020:25596] --1,ind:1
62 2019-04-03 01:05:20.987476+0800 块循环最具优势![3020:25596] --2,ind:2
63 2019-04-03 01:05:20.987499+0800 块循环最具优势![3020:25596] --3,ind:3 */
64 // [lArr1 enumerateObjectsUsingBlock:^( NSNumber* obj, NSUInteger idxOut, BOOL * _Nonnull stopOut) {
65 // NSLog(@"%@,ind:%lu", obj,(unsigned long)idxOut);
66 //
67 // if (idxOut == 2) {
68 // *stopOut = YES;
69 // }
70 //
71 //
72 // [lArr2 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idxIn, BOOL * _Nonnull stopIn) {
73 // NSLog(@"--%@,ind:%lu", obj,(unsigned long)idxIn);
74 // if (idxIn == 3) {
75 // *stopIn = YES;
76 // *stopOut = YES;
77 // }
78 // }];
79 //
80 // }];
81
82
83 }
84 return 0;
85 }
运行上面代码可见:
可以实现!需要差异化小标和停止参数,然后在里层循环对外循环的stopOut进行操作!此时,对内循环stopIn是否操作会决定内循环是否能执行完毕。
- WordPress 网站基于REST API 开发“微信小程序”实战
- 摩拜共享汽车亮相 首批新能源电动汽车试运行
- 基于SQL Server 2008 Service Broker构建企业级消息系统
- Windows主机管理系统Websitepanel
- 自定义Appfabric Cache 配置提供程序
- 2017年发生在上海的科技大新闻
- REST当中为什么要使用HTTP PUT
- 推荐一个在Linux/Unix上架设ASP.NET的 WEB服务器--Jexus
- 人工智能与工业融合:没有你,对我很重要……
- DeepMind哈萨比斯对话哈里王子:2018年AI最大的突破在生物或化学
- 提升用户体验,微信小程序“授权失败”场景的优雅处理
- extjs 基础部分
- WordPress 网站开发“微信小程序”实战(二)
- Extjs form 组件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录
- openGauss备机追数Catchup过程中主库写入阻塞问题
- openGauss830版本中对于备份模块的增强与当前问题
- spring boot自动配置原理
- 网站日志分析完整实践