OC中四种遍历方式
2024-09-06 23:06:01
标准的C语言for循环、Objective-C 1.0出现的NSEnumerator、Objective-C 1.0出现的for in快速遍历、块遍历。
遍历的话,一般是NSArray、NSDictionary、NSSet和自定义的collection。
0、初始化数据
NSArray *array = @[@"ele1", @"ele2", @"ele3", @"ele4"];
NSDictionary *dict = @{@"name" : @"xiaohong", @"age" : @"", @"gendar" : @"woman"};
1、使用for循环
// 遍历数组
for (int i = ; i < array.count; i++) {
NSString *eleString = [array objectAtIndex:i];
NSLog(@"%@", eleString);
}
// 遍历字典
for (int i = ; i < dict.count; i++) {
NSString *valueString = [dict.allValues objectAtIndex:i];
NSLog(@"%@", valueString);
}
// 附加:使用枚举块,forin也能反向遍历
for (NSString *eleString in [array reverseObjectEnumerator]) {
NSLog(@"%@", eleString);
}
2、使用for-in遍历。特点是简洁、高效。但是注意不要在forin循环体中对元素进行修改
// 遍历数组
for (NSString *eleString in array) {
NSLog(@"%@", eleString);
}
// 遍历字典
for (NSString *valueString in dict.allValues) {
NSLog(@"%@", valueString);
}
// 注意:
for (NSString *keyString in dict) {
// keyString就是dict中的key值
}
3、使用枚举器遍历
// 遍历数组
// 为这个数组生成一个顺序的枚举器,reverseObjectEnumerator为倒序枚举器
NSEnumerator *arrayEnumerator = [array objectEnumerator];
// 不能使用NSString *string = nil
NSString *string = @"";
while (string) {
string = [arrayEnumerator nextObject];
if (string != nil) {
NSLog(@"%@", string);
}
}
// 遍历字典
// 为这个字典生成一个遍历key的枚举器,objectEnumerator为遍历value的枚举器
NSEnumerator *dictKeyEnumerator = [dict keyEnumerator];
// 不能使用NSString *string = nil
NSString *keyString = @"";
while (keyString) {
keyString = [dictKeyEnumerator nextObject];
if (keyString != nil) {
NSLog(@"%@", keyString);
}
}
// 附加:使用枚举块,forin也能反向遍历
for (NSString *eleString in [array reverseObjectEnumerator]) {
NSLog(@"%@", eleString);
}
4、基于块枚举。handler中的参数类型和形参名都是可以进行更改的,这样就省去了手动强制转换代码。
// 枚举数组
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if (idx == array.count - ) {
*stop = YES;
}
}];
// 反向遍历数组
[array enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if (idx == array.count - ) {
*stop = YES;
}
}];
// 枚举字典
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@", obj);
if ([key isEqualToString:@"name"]) {
*stop = YES;
}
}];
// 反向遍历字典
// 需要注意的是:只有在遍历数组或者有序set等有顺序的collection时,反向遍历才有意义。
最新文章
- PDO运用
- short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确
- 表单,css
- Struts2的一个问题: 找不到struts.xml的路径问题
- 14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取
- javascript定时器:setTimeout与setInterval
- CocoaPods停在Analyzing dependencies解决方案
- Retrofit,Rxjava,OkHttp3的配置
- 使用Arrays.asList抛出java.lang.UnsupportedOperationException
- FFT的一种迭代实现
- 小程序图表wx-chart
- git第六节---git 远程仓库
- 手动搭建ABP2.1.3——基础框架
- Java进程线程理解
- scipy稀疏矩阵
- Java.Util.List(List接口)
- [JL]最后的晚餐 动态规划(DP) codevs5318
- 【转】JABC访问oracle数据库报ORA-12505
- win7共享文件夹设置无密码
- c++实现全密码生成
热门文章
- ZooKeeper下载安装配置-单机版配置
- 计算机二级-C语言-程序填空题-190117记录-对文件的处理,复制两个文件,往新文件中写入数据。
- 动态规划: 最大m子段和问题的详细解题思路(JAVA实现)
- js中substr、substring、indexOf、lastIndexOf的用法
- Cisco AP-AP重置操作
- A10131013 Battle Over Cities (25分)
- Codeforces Round #589 (Div. 2)E(组合数,容斥原理,更高复杂度做法为DP)
- Centos10卸载nginx
- phpsduty安装SSL证书,apache不能启动,解决方案
- problem :无法显示activemq的管理界面