码迷,mamicode.com
首页 > 移动开发 > 详细

iOS学习-5.遍历

时间:2016-04-08 20:05:48      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

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

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遍历,没有加,因为太多了。。。。



iOS学习-5.遍历

标签:

原文地址:http://www.cnblogs.com/asamu/p/5369656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!