iOS学习-5.遍历

本文转自文顶顶,稍加修改

1.for循环

要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法

//1).数组
    NSArray *arr1 = @[@"a1",@"a2",@"a3",@"a4"];
    for (int i = 0; i<arr1.count; i++) {
        NSLog(@"%@",arr1[i]);
    }
    /*
     2).字典
     由于字典是无序的,遍历前要排序
     1.按NSDictionary的key来对其进行排序:
     2.将字典的Value再放到一个字典里面,key分别使用有序的字符串
     3.先将字典转模型,再放到数组里面
     4.先将dict的allkeys赋给一个数组,然后通过sortedArrayUsingComparator:方法对数组排序,然后遍历数组取字典对应key的值就ok
     */
    NSDictionary *dic = @{@"1":@"a",@"2":@"b",@"3":@"c",@"4":@"d"};
    NSArray *arr2 = [dic allKeys];
    NSArray *sortA = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    for (int i = 0; i<sortA.count; i++) {
        NSString *key = sortA[i];
        NSString *str = [dic objectForKey:key];
        NSLog(@"%@",str);
    }
    // 3).反向遍历----降序遍历----以数组为例
    NSArray *arr3 = @[@"12",@"13",@"14",@"15"];
    NSInteger arr3Count = [arr3 count]-1;
    for (NSInteger i = arr3Count; i>=0; i--) {
        NSString *obj = arr3[i];
        NSLog(@"%@",obj);
    }

优点:简单

缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数组』作为中介来处理,多出了一部分开销。

2.for....in....遍历

在Objective-C 2.0 中增加了for ...In 形式的快速遍历。此种遍历方式语法简洁,速度飞快。示例如下:

 // 1).数组
    NSArray *arr1 = @[@"1",@"2",@"3",@"4"];
    for(id obj in arr1){
        NSLog(@"%@",obj);
    }
    // 2.)字典
    NSDictionary *dic2 = @{@"1":@"one",@"2":@"two",@"3":@"three"};
    for(NSString *str in dic2){
        NSLog(@"%@",dic2[str]);
    }
    // 3).处理集合
    NSSet *set = [[NSSet alloc]initWithObjects:@"王尼玛",@"铁柱",@"赵无能", nil];
    for (id obj in set) {
        NSLog(@"%@",obj);
    }
    // 4).反向遍历,降序遍历--以数组为例
    NSArray *arr4 = @[@"我",@"的",@"世",@"界"];
    for (id obj in [arr4 reverseObjectEnumerator]) {
        NSLog(@"%@",obj);
    }

优点:1)语法简洁;2)效率最高;

缺点:无法获得当前遍历操作所针对的下标。

3.基于Block的遍历方式

基于Block的方式来进行遍历是最新引入的方法。它提供了遍历数组|字典等类型数据的最佳实践。示例如下:

-(void)step3{
    // 1).数组
    NSArray *arr1 = @[@"王",@"二",@"麻",@"子"];
    [arr1 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%zd--%@",idx,obj);
    }];
    // 2).字典
    NSDictionary *dii = @{@"1":@"生",@"2":@"活",@"3":@"不"};
    [dii enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"%@:%@",key,obj);
    }];
    // 3).集合
    NSSet *set = [[NSSet alloc]initWithObjects:@"止",@"眼",@"前",@"的",nil];
    [set enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {
     NSLog(@"%@",obj);
    }];
    // 4).反向遍历,降序遍历--以数组为例
    NSArray *arr4 = @[@"1",@"2",@"3",@"4"];
    [arr4 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%zd--%@",idx,obj);
    }];
}

优点:1)遍历时可以直接从block中获得需要的所有信息,包括下标、值等。特别相对于字典而言,不需要做多余的编码即可同时获得key和value的值。

   2)能够直接修改block中key或者obj的类型为真实类型,可以省去类型转换的工作。

   3)可以通过NSEnumerationConcurrent枚举值开启并发迭代功能。

说明:基于Block的遍历方式在实现反向遍历的时候也非常简单,使用enumerateObjectsWithOptions方法,传递NSEnumerationReverse作为参数即可,在处理遍历操作的时候推荐基于Block的遍历方式。

使用NSEnumerator遍历,没有加,因为太多了。。。。

时间: 2024-08-10 21:23:10

iOS学习-5.遍历的相关文章

2015最新iOS学习线路图

iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置的众多技术和功能让 Apple设备始终保持着遥遥领先的地位. iOS学习路线:http://www.mobiletrain.org/page/ios.html 课程分  类 课程模块 模块介绍 课程内容 Part1C语言 C语言和Objective-C语言 C语言 Mac系统及常用工具.进制:C数据

iOS学习之事件处理的原理

在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? (1)UITouch 对象的简介 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的 UITouch 对象 一根手指对应一个 UITouch 对象 UITouch 的作用 保存着根手指相关的信息,比如触摸的位置.时间.阶段 当手指移动时,系统会更新同一个 UITouch 对象,使之能够一直保持该手指

iOS学习笔记---oc语言第五天

字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key-value对)的数据 对于“name:张三”来讲,key就是“name”,key对应的value是“张 三” 一个key-value对认为是一个元素(实体),字典是存储key-value对 的容器. 特点: 与数组不同,数组靠下标存取数据,数组的下标是唯一的. 字典靠key存取元素.key不能重复,

iOS学习47之第三方-FMDB

将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB简介 1> 概述 iOS 中原生的 SQLite API 在进行数据存储的时候,需要使用 C语言 中的函数,操作比较繁琐.于是,就出现了一系列将SQLite API 进行封装的库,例如 FMDB.PlausibleDatabase.SQLitePersistentObjects 等. FMDB 是一

iOS学习之iOS沙盒(sandbox)机制和文件操作

iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 1.iOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行. 通过这张图只能从表层上理解sandbox是一种安全体系,应

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

iOS学习笔记20-地图(二)MapKit框架

一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种方式可以对地图进行精准的控制 调用苹果官方自带的地图应用,主要用于一些简单的地图应用,无法精确控制 使用第三方地图开发SDK库 用得最多的还是MapKit,所以这节就只讲MapKit的使用. 二.MapKit核心类 MapKit的核心类为地图展示控件MKMapView,以下是常用的属性.对象方法以及

我的IOS学习资源收录2

本套教程出自ios教程网:http://ios.662p.com 预览ios教程网-源码天堂-7 1.iOS基础3-第一个iOS程序:QQ登录界面-ios视频教程网  ...2 iloveios2014-2-3 1017645 huasy2014-5-25 16:23 ios教程网-源码天堂-7 0.iOS基础2-iOS运行过程详解-ios视频教程网 iloveios2014-2-3 76443 想飞20032014-3-19 17:09 ios教程网-源码天堂-6 9.iOS基础1-iOS开发

IOS学习笔记-触摸事件

一.事件传递的过程1.用户手指触摸屏幕,产生一个事件对象 2.系统会将这个事件对象添加到事件队列(先进先出)中 3.由UIApplication取出事件队列中的事件对象进行处理 4.UIApplication会先将事件对象传递给主要的UIWindow(当然,要先检测UIWindow是否能够接收和传递事件) 5.UIWindow会遍历所有的子控件,看看触摸点有没有落在某个子控件上面: 1> 如果触摸点没有落在子控件上,那么就由UIWindow直接处理这个事件,事件传递完毕 2> 如果触摸点落在子