---------------------- <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];
}
for(id objin array)
与第一种相比,不同之处是不通过下标来实现遍历的,它 ‘遍历光标’ 移动过程并没有显示地展示出来,这样试用起来更加便捷。试用范围与枚举一样。有序的: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>、期待与您交流! -----------------------