Objective-C集合遍历的几种方式

Objective-c学习资料集合 非常全面的Objective-c的学习教程,里面包含了很多程序员的学习笔记有图文解说,还有语法解说,还有使用函数以及如何创建,不管你是新手还是高手都是你Objective-c开发的好工具好帮手,里面还包含了学习网站的教学视频和图文教程。不下是你的损失 立即下载

集合遍历的几种方式

简单for循环

    //    定义集合时尽量采用语法糖的格式,简洁高效
    NSDictionary *dictionary = @{ @"1" : @"a",
                                  @"2" : @"b",
                                  @"3" : @"c",
                                  @"4" : @"d"
                                  };
    NSArray *keys = dictionary.allKeys;
    for (int i = 0; i < dictionary.count; i++) {
        NSLog(@"%@ : %@", keys[i], dictionary[keys[i]]);
    }
简单for循环在这里不会赘述,但是我会拿它与for in快速遍历做一个对比,我们普遍认为for in快速遍历一定比for循环快,但是只有在集合中元素很多的情况下这才是对的,当集合中元素很少的情况下for循环比for in循环更快。具体的对比可以参考孙源的这篇博客[iOS 中集合遍历方法的比较和技巧](http://blog.sunnyxx.com/2014/04/30/ios_iterator/)

NSEnumerator枚举遍历

    NSDictionary *dictionary = @{ @"1" : @"a",
                                  @"2" : @"b",
                                  @"3" : @"c",
                                  @"4" : @"d"
                                  };
    NSEnumerator *enumerator = [dictionary objectEnumerator];
    id value = nil;
    while (value = [enumerator nextObject]) {
        NSLog(@"%@",value);
    }
这种形式不得不令人想起Java的迭代器,值得一提的也就是nextObject这个方法了,这个方法返回集合中下一个元素,若没有下一个元素返回nil。这种遍历方式在开发中也很少用到。
使用NSEnumerator对数组进行遍历的时候,还可以倒序遍历:
NSArray *array = @[ @"one",
                        @"two",
                        @"three",
                        @"fourth"
                        ];
NSEnumerator *arrayEnumerator = [array reverseObjectEnumerator];
while (value = [arrayEnumerator nextObject]) {
    NSLog(@"%@",value);
}
值得注意的是:若对可变容器进行遍历时,不可对可变容器修改。如下代码会导致crash。
    NSEnumerator *enumerator = [dictionary objectEnumerator];
    id value = nil;

    while (value = [enumerator nextObject]) {
        NSLog(@"%@",value);
        [dictionary setValue:@"q" forKey:@"a"];

    }

为什么会出现这种原因?
官网上关于NSEnumerator这样说:
The enumerator subclasses used by NSArray, NSDictionary, and NSSet retain the collection during enumeration. When the enumeration is exhausted, the collection is released.
大致的意思是(这次百度翻译挺给力,没有瞎扯淡,毕竟四级没过的人,看官方文档,呵呵):
通过NSArray,NSDictionary使用枚举器类、集合枚举过程中保留和不可变。当枚举耗尽时,集合被释放。
这样就没困惑了。

for in快速遍历

    NSDictionary *dictionary = @{ @"1" : @"a",
                                  @"2" : @"b",
                                  @"3" : @"c",
                                  @"4" : @"d"
                                  };
    for (NSString *key in dictionary) {
        NSLog(@"%@ : %@", key, dictionary[key]);
    }
这种遍历集合的方法在开发中最常用,因为它形式简洁、效率也高。它的缺点是无法访问到集合下标,而且、也是非常值得注意的一点,若对可变容器进行遍历时,不可对可变容器修改。如下代码会导致crash:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:@"1" forKey:@"a"];
[dictionary setObject:@"2" forKey:@"b"];
[dictionary setObject:@"3" forKey:@"c"];
[dictionary setObject:@"4" forKey:@"d"];
for (NSString *key in dictionary) {
    NSLog(@"%@ : %@", key, dictionary[key]);
    [dictionary setObject:@"111" forKey:@"a"];
}

Excuse me?这个错误好熟悉?
我们知道for in又称NSFastEnumeration,而NSFastEnumeration又采用了NSEnumerator,所以也有这种缺陷。

基于块的遍历

NSLog(@"------------------------");
    NSArray *array = @[ @"one",
                        @"two",
                        @"three",
                        @"fourth"
                        ];

    [array enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@ %lu", obj, (unsigned long)idx);
    }];
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@ %lu", obj, (unsigned long)idx);
    }];
    NSLog(@"------------------------");
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@ %lu", obj, (unsigned long)idx);
    }];
    NSLog(@"========================");

运行结果是这样滴:

2016-11-06 13:25:24.274 集合遍历的几种方式[4298:979287] ------------------------
2016-11-06 13:25:24.274 集合遍历的几种方式[4298:979287] one 0
2016-11-06 13:25:24.275 集合遍历的几种方式[4298:979287] two 1
2016-11-06 13:25:24.275 集合遍历的几种方式[4298:979287] three 2
2016-11-06 13:25:24.275 集合遍历的几种方式[4298:979287] fourth 3
2016-11-06 13:25:24.275 集合遍历的几种方式[4298:979287] fourth 3
2016-11-06 13:25:24.276 集合遍历的几种方式[4298:979287] three 2
2016-11-06 13:25:24.276 集合遍历的几种方式[4298:979287] two 1
2016-11-06 13:25:24.276 集合遍历的几种方式[4298:979287] one 0
2016-11-06 13:25:24.276 集合遍历的几种方式[4298:979287] ------------------------
2016-11-06 13:25:24.277 集合遍历的几种方式[4298:979287] one 0
2016-11-06 13:25:24.277 集合遍历的几种方式[4298:979287] three 2
2016-11-06 13:25:24.277 集合遍历的几种方式[4298:979324] two 1
2016-11-06 13:25:24.277 集合遍历的几种方式[4298:979325] fourth 3
2016-11-06 13:25:24.278 集合遍历的几种方式[4298:979287] ========================
对于一个方法,官方这样描述:
Executes a given block using the objects in the array at the specified indexes.By default, the enumeration starts with the first object and continues serially through the array to the last element specified by indexSet. You can specify NSEnumerationConcurrent and/or NSEnumerationReverse as enumeration options to modify this behavior.This method executes synchronously.ImportantIf the block parameter or the indexSet is nil this method will raise an exception.
值得注意的是:
1. 这个方法从集合第一个元素开始,顺序遍历该集合,这和打印结果一样
2. 该方法同步执行这和打印结果一样
对于第二个方法,比第一个方法多了一个参数NSEnumerationReverse,从结果可以看出:遍历顺序为倒序,同步执行。
对与第三个方法,指定了NSEnumerationConcurrent 这个参数,从结果可以看出是无序的,为什么会无序?
因为该块内的遍历是并发执行的。
iOS遍历集合(NSArray、NSDictionary、NSSet)的方法总结 主要介绍了iOS集合遍历(NSArray、NSDictionary、NSSet)的方法,文中给出了详细的方法示例,并总结了各个方法的优缺点来供大家学习参考,需要的朋友们下面来一起看看吧。 立即下载

相关推荐

Matlab实战:如何用MMG方程预测船舶轨迹(附完整代码)

本文提供了一份基于MMG方程的Matlab实战指南,详细讲解了如何从零构建船舶轨迹预测模型。内容涵盖MMG模型的核心原理、Matlab代码框架设计、动力学函数实现、参数调优与验证方法,并附有完整代码示例,帮助工程师和研究者快速掌握这一船舶操纵性预测的关键技术。

v6b7n8m9q0的博客 518

【NSDictionary数组的遍历 Objective-C语言】

NSDictionary数组的遍历 Objective-C语言

madoca的博客 1089

QFN封装芯片手工焊接实战:从焊盘处理到拖焊技巧

本文详细介绍了QFN封装芯片手工焊接的全过程,从焊盘处理到拖焊技巧,再到常见问题的现场修复方法。通过实战经验分享,帮助工程师和DIY爱好者掌握0.5mm小间距QFN芯片的焊接技术,提升焊接成功率和质量。重点讲解了垂直与平行拖焊手法的对比应用,以及焊后清理与质量检验的关键步骤。

weixin_42652674的博客 532

常用的六种集合的遍历方式

一.List集合的存储特点是元素有序,可重复。遍历List集合有以下几种方式: 1.普通for循环: List<String> list = new ArrayList<String>(); list.add("北京"); list.add("上海"); list.add("广州"); list.add("西安"); //通过普通for循环,相当于根据数组的小标遍历集合 for(int i = 0;i<list.size();i++) {...

m0_59340907的博客 1万+

AUTOSAR AP平台开发避坑指南:基于华为MDC的接口配置与数据通道实战

本文详细解析了AUTOSAR AP平台与华为MDC的协同开发实践,涵盖接口配置、数据通道优化及资源分配策略。通过实战案例展示如何解决传感器接入、通信协议栈优化等常见问题,提升智能驾驶系统性能。特别针对MDC平台特性,提供执行管理、调试调优及安全设计的专业指导,助力开发者高效完成ADAS/AD系统开发。

julia4scientist的博客 1137

SAP FAGLFLEXT 是 SAP 新总账的核心余额表,存储多维度的汇总余额数据。核心结论:该表按 “科目 + 会计年度 + 期间 + 维度” 存储累计余额,字段可分为基础标识

FAGLFLEXT是SAP新总账的核心余额表,采用"科目+年度+期间+维度"结构存储多维汇总数据。其字段分为基础标识(科目、年度等)、维度细分(公司代码、利润中心等15个维度)、金额数值(本外币余额)、辅助控制(状态标识)四大类,支持新总账的灵活核算。该表通过凭证自动更新,与旧总账GLT0相比显著扩展了维度核算能力,各维度需在科目主数据或Ledger配置中启用才能使用。

金牌架构师 454

集合的三种遍历方式

迭代器(Iterator)是一种对象,它可以让我们遍历集合对象中的元素。Java中的集合类(例如ArrayList、LinkedList、HashSet、TreeSet等)都实现了Iterable接口,因此可以使用迭代器来遍历集合中的元素。

weixin_73869209的博客 5920

基于Python实现人脸识别相似度对比

随着人工智能技术的不断进步,人脸识别成为了一种广泛应用的技术。人脸相似度对比是其中的一个重要应用场景,可以用于人脸搜索、身份验证等方面。本文将介绍如何使用Python实现人脸相似度对比。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 9808

NSDictionary创建、引用以及遍历等功能(Objective-C 开发范例)

NSDictionary创建、引用以及遍历等功能

q_023的博客 1889

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的远距离停车位检测系统(深度学习代码+UI界面+训练数据集)

本文详细介绍了基于YOLOv5/YOLOv6/YOLOv7/YOLOv8深度学习模型的远距离停车位检测系统的完整实现方案。该系统能够准确识别200米范围内的停车位状态,为智能停车场管理系统、自动驾驶车辆提供关键的视觉感知能力。文章涵盖算法原理、数据集构建、模型训练、系统实现及优化策略,并提供完整的代码实现和UI界面设计。关键词:YOLO系列,深度学习,停车位检测,计算机视觉,智能交通系统pythonimport cv2import os"""创建数据存储目录""""""定时采集图像"""

YOLO 185

C# WPF上位机实战:从零开发空压机监控系统(含实时监控+故障预警+数据追溯)

在工业生产场景中,空压机作为核心动力设备,常面临这些痛点:压力/温度异常导致停机、油耗超标未及时发现、设备故障追溯无数据支撑、人工巡检效率低且易遗漏。而基于C# WPF开发的空压机监控系统,能通过实时采集设备运行参数、智能分析运行状态、联动故障预警,实现“状态监控-异常告警-数据追溯-远程管控”全流程自动化,完美解决传统管理模式的弊端。今天就带大家落地这套空压机监控系统,基于C# + .NET 8 + WPF + Modbus TCP/RTU协议,整合压力、温度、油耗、运行时长等核心参数监控,搭配WPF的数

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1102

集合的5种遍历方式

方式一:使用普通for循环,size()和get(int index)结合。【只能操作list集合】   ArrayList list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); for(int i = 0; i &lt; list.size(); i++){ System.out.println(l...

myroncham的博客 1万+

AI应用架构师进阶:智能控制系统架构的多Agent设计

本文将从“AI应用架构师”的视角,系统讲解智能控制系统中多Agent架构的设计方法。理解多Agent系统的核心特性与在智能控制场景中的优势;掌握多Agent架构的设计流程:从需求分析到角色划分、通信设计、决策实现;通过实战案例(智能家居控制场景),手把手带你落地一个多Agent智能控制系统;探讨进阶话题:动态Agent组织、安全性设计、与大语言模型(LLM)的融合等。在多Agent系统中,Agent(智能体)是具备自主决策能力的最小执行单元。

小程序开发 1085

Objective-C中遍历字典、数组和集合的几种常见方式

一、使用for循环   在objective-c语言中,要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:  //普通的for循环遍历 -(void)iteratorWithFor {     //////////处理数组//////////     NSArray *arrayM = @[@"1",@"2",@"3",@"4"];     NSIntege

qq_32506555的博客 1017

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Foundation框架—集合

一、数组是实例的有序集合,在Foundation框架中定义为NSArray类。 1. NSArray的基本介绍     NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组。     C语言数组有一个缺点即数组中只能存放同种数据类型的元素。     OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。 2. NSArr

北往风吹 461

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NSArray,NSSet,NSEnumerator,NSDictionary及对应Mutable介绍

NSArray,NSSet,NSEnumerator,NSDictionary及对应Mutable介绍 上述的这些都是 Objective-C 中的集合类,不带 Mutable 的是不可修改的集合类, 带 Mutable 的是可以修改的集合类。下面的例子中有足够的注释,非常清晰,不多说了。 1. NSArray与NSMutableArray 就是通常的数组

htttw的专栏 6430

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IOS学习笔记之Object-C(三)

NSArray 有顺序;固定的,一旦创建,里面的元素不可变;只能放OC的对象(且任何OC的对象都能放入);不能放nil(有特殊意义,代表数组结束); 创建: NSArray *array = [NSArray array]; //创建一个空数组 [NSArray arrayWithObject:@”123”];//创建一个带1个元素的数组 [NSArray arrayWithObj

xinpings的博客 461

iOS 块枚举与for循环

在编程中经常需要列举collection中得元素,在当前的Objective-C语言中又多重办法实现此功能,可以用C语言循环,也可以用Objective-C 1.0中得NSEnumerator以及Objective-C 2.0的快速便利(fast enumeration)。在引入了“block”之后,又多出来了集中的的遍历方式。下面详细说明。 for循环 NSArray *anAr

王颜华的博客 2340

数组的使用

/******************************************************************************************* NSArray ****************************************************************************************

code life 238

Objective-C语言的集合

集合是存储一组数据的容器。NSArray:有序集合,允许重复元素。:无序集合,以键值对的形式存储数据,键是唯一的。NSSet:无序集合,不允许重复元素。Objective-C的集合类型为开发者提供了强大的数据存储和处理能力。通过合理使用NSArray、NSDictionary和NSSet,可以更高效地管理和操作数据。希望本文的介绍和示例能够帮助读者更好地理解和运用Objective-C中的集合类型,提升开发效率和代码质量。

2501_91403807的博客 790

数组反向遍历ios_iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式说明:1)该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code一、使用for循环要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:1 //普通的for循环遍历2 -(voi...

weixin_39714763的博客 263

Objective-C中的各种遍历(迭代)方式

该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。 一、使用for循环   要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:  // 普通的for循环遍历 - (void)iteratorWithFor { //////////处理数组////////// NSArray *arrayM = @[@"1",@"2

wsh7365062的博客 1133

Objective-c:集合类型遍历方法详解

前言在编程中经常需要遍历集合类型的元素,当前有多种方法实现此功能,初学者大多习惯于用标准的C语言循环,当然也可以使用 NSEnumerator 以及快速遍历(for-in),Objective-c 引入‘块’特性后,又多出来几种新的遍历方式,采用这几种新的遍历方式,可大幅度简化代码过程。本文主要讲解常用的几种集合类型:NSArray、NSSet 以及NSDictionary 的遍历方式。for 循环

李鴻耀 2475

Objective-C如何使用对象集合学习系列二

将数组的内容保存到文件系统中, 使用 NSDictionary 与 NSMutableDictionary 创建字典,在字典中添加与删除对象,通过不同方式遍历字典,将字典的内容保存到文件系统中。

ZhouJoLoker的专栏 1592
上一篇: UINavigationController基础篇
下一篇: iOS开发者的Java学习笔记
iOS_aFei
博客等级 码龄12年 15粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值