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

---------------------- <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>、期待与您交流! -----------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值