您的位置:首页 > 职场人生

黑马程序员 OC中的四种遍历方法

2014-07-23 09:38 218 查看
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------------------

OC中四种遍历方式

再初学OC时, 我们常常会遇到一些遍历这样的操作,今天刚好看到有关遍历的集中方法,先把它们以代码的形式呈现给大家,同时说明它们试用的环境.

1、普通的索引的方式,通过在集合中的下标查找集合中的元素,这种方式必须先知道元素在集合中的位置,否则不适用这种方式,其大多形如:

for(int i=0;i<array.count;i++)
这种方式也是语言采用的最多的一种方式,我们几乎在所有的语言中都能看到这种遍历的方式。我们对集合的操作在循环体中实现即可。while与之类似,所以就归结为同一种了。
2、枚举方式,我们借助有类似迭代功能的类来,NSEnumerator辅助完成遍历工作,这个类与java的迭代器很像。该类有一个方法nextObject可以将当前的位置往后移,这个特征与循环联用就可以实现遍历集合。从这里我们可以看出它与传统的遍历(上面那种)不同之处是它事先不知道操作对象的下标,而是通过集合位置的后移来实现遍历,所以这种方式比前者试用范围更广,像无序的集合类NSSet也可以试用这种方式。其形如:

// new a Enumerator
   NSEnumerator *enumerator = [array objectEnumerator];
    // traverse the array
   id thingie = [enumerator nextObject];
   while (thingie)
    {
        // print current object
       NSLog(@"enumerator -- %@",thingie);
        // next object
        thingie =[enumeratornextObject];
    }
其实它的实质和传统的是一样的,只不过将i++这个操作用方法[enumerator nextObject]替代了而已,其实它们算法过程还是一样的。
3、快速枚举方式,一听这种方式,肯定与前面的枚举方式有一定关联,但事实好像并没有什么关联,只是这种方式比枚举更加快捷,也许就称之为快速枚举了的吧,它的语法方式与一些脚本语言很类似,形如:

for(id objin array)
与第一种相比,不同之处是不通过下标来实现遍历的,它 ‘遍历光标’ 移动过程并没有显示地展示出来,这样试用起来更加便捷。试用范围与枚举一样。
4、代码块方式:这种方式是OC为纯C语言添加的一个代码块特性,OC为不同的集合添加不同遍历代码块有序的,无序的。具体操作在代码内部实现。

有序的:enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop){...}

无序的:enumerateObjectsUsingBlock:<#^(id obj, BOOL *stop){...}
上面两个方法的差别是少一个关于对象索引的下标参数,这里的stop的作用相当于循环中break功能是结束循环用的。
我举一个例子(其中array是移NSArray对象):
[array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {

if(idx==1) // 当下标为停止遍历
        {
            *stop =YES;
        }
       NSLog(@"block -- %@",obj);
    }];

当程序执行到上述代码时,系统会给出循环结构,上述代码即等价于下面代码,其中myBlock时代码块,代码块中内容是上面代码块中内容:

 BOOL stop =NO;
   for(int i=0;i<array.count;i++)
    {
       id obj = [array objectAtIndex:i];
       if(i==1) 
        {
            stop =YES; // 下标为1时停止遍历
        }
       if(stop) // 是否停止
        {
           return;
        }
        myBlock(obj,i,&stop);
// 执行代码块内容

    }
使用代码块的好处:代码块可以让循环操作并发执行,,而通过上面几种方式,执行操作要一项一项的现行完成。

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息