快速枚举
2012-08-14 08:34
218 查看
快速枚举
快速枚举的特性使得我们可以使用简洁的语法来安全、有效地枚举集合中的内容。
for...in
快速枚举的特性使得我们可以对集合中的元素进行枚举。其用法如下:for ( 类型 变量 in 表达式 )
{
处理语句
}
或者是
类型 变量;
for ( 变量 in 表达式 )
{
处理语句;
}
在上面的两种形式中,表达式的值都是要遵守NSFastEnumeration协议的。其中的迭代变量会被依次赋值为表达式值对象中的每一个元素,并针对每一个元素执行处理语句。当循环结束的时候,也就是所有元素都被遍历完毕的时候,迭代变量会被赋值为nil。如果循环提前结束,那么迭代变量的值将指向最后一次被遍历的那个对象。
使用快速枚举有如下的好处:
■ 使用快速枚举的效率要高很多,比如和直接使用NSEnumerator相比较。
■ 快速枚举的语法很简洁
■ 这种枚举是"安全的"。快速枚举使用到了修改监视器,也就是说如果在枚举的过程中企图修该集合,则会产生异常。
由于在枚举的过程中是不能对集合进行修改的,因此多个枚举是可以同时并发进行的。
遵守快速枚举协议
任何对外界提供访问对象的结合的类都可以遵守NSFastEnumeration协议,来支持快速枚举机制。Cocoa中的集合类NSArray,NSDictionary以及NSSet都遵守该协议,NSEnumerator也是。就NSArray和NSSet而言,很明显这种枚举是针对其中的内容进行枚举。而对其他的类来说,必须在对应的文档中对其所枚举的内容进行明确说明。例如,NSDictionary和核心数据类NSNanagedObjectModel都是支持快速枚举的。其中NSDictionary是对其中的关键字也就是key进行枚举;而NSManagedObjectModel则是对其中的条目entities进行枚举。
使用快速枚举
下面的代码段展示了如何针对NSArray和NSDictionary类的对象使用快速枚举。[cpp] view
plaincopy
NSArray *array =[[NSArray arrayWithObjects:@"One",@"Two",@"Three",@"Four", nil]'
for(NSString *element in array)
{
NSLog("element:%@",element);
}
NSDictionary *dictionary =[[NSDictionary dictionaryWithObjectsAndKeys:@"quattuor",@"four",@"quninque",@"file",@"sex",@"six",nil];
NSString *key;
for(key in dictionary)
{
NSLog(@"English:%@, Latin:%@", key, [dictionary valueForKey:key]);
}
还可以使用NSEnumerator类的对象来进行快速枚举,如下:
[cpp] view
plaincopy
NSArray *array =[[NSArray arrayWithObjects:@"One",@"Two",@"Three",@"Four",nil];
NSEnumberator *enumerator = [array reverseObjectsEnumerator];
for(NSString *element in enumerator)
{
if ([element isEqualToString:@"Three"])
{
break;
}
}
NSString *next =[enumbertor nextObject];
//next = "Two"
对于元素有序的结合或者是枚举器(enumerators)来讲,,比如NSArray或者是NSEnumerator的实例,枚举的过程也是按照元素的顺序进行的,因此,只需要对迭代器进行简单的计数就可以得到元素的正确索引。
[cpp] view
plaincopy
NSArray *array = /* 假定数组存在*/;
NSUInteger index = 0;
for(id element in array)
{
NSLog(@"Element at index %u is %@", index, element);
index++;
}
关于快速枚举的其它的方面:快速枚举和标准的for循环是一样的。可以使用break来中断这种迭代。如果在枚举的过程中想跳过某些元素,对其不进行处理,则可以使用嵌套的条件语句,如下:
[cpp] view
plaincopy
NSArray *array = /* 假定数组存在*/;
for(id element in array)
{
if(/*对element进行某种检查*/)
{
/*只有对通过了检查的元素才执行该段代码*/
}
}
如果我们需要跳过第一个元素,并只对后面的5个元素进行处理,则可以这样做:
[cpp] view
plaincopy
NSArray *array = /* 假定数组存在*/;
NSUInteger index = 0;
for(id element in array)
{
if(index != 0)
{
NSLog(@"Element at index %u is :%@", index, element);
}
if(++index>=6)
{
break;
}
}
相关文章推荐
- fast enumeration/快速枚举
- OC - 集合类型的快速枚举
- c语言的快速枚举
- 快速枚举 . 数组的操作:对象的添加.移除.替换. 两个对象的交换等
- Objective-C中快速枚举和数组排序
- Swift快速入门之枚举与结构
- OC 快速枚举总结
- 快速枚举因子(约数)
- Objective-C(十二、快速枚举,枚举器NSEnumerator和集合类NSSet)——iOS开发基础
- 字符串、快速枚举
- 51nod oj 1256 1119 1013 1083 1014 1081<组合数+逆元+快速幂,DP,枚举,树状数组>
- JAVA 快速归类整形常数——枚举
- Block块快速枚举
- UVALive - 7457 Discrete Logarithm Problem 费马小定理+暴力枚举+快速幂
- Objective-C 编程语言官网文档(八)-快速枚举
- OC_数组(可变数组),快速枚举,相关方法总结
- 通过快速枚举的方法查找文件
- Objective-C 学习笔记 - part 8 - 快速枚举
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
- UVA 11889-Benefit(数学_快速枚举因子)