第48条:多用块枚举,少用for循环
1.基本的for循环
NSArray *array = /*...*/;
for (int i = 0; i < anArray.count; i++)
{
id object = anArray[i];
//Do something with 'object'
}
2.NSEnumerator遍历法
NSArray *anArray = /* ... */;
NSEnumerator *enumerator = [anArray objectEnumerator];
id object;
while ((object = [enumerator nextObject]) != nil)
{
// Do something with 'object'
}
NSArray *anArray = /* ... */;
NSEnumerator *enumerator = [anArray reverseObjectEnumerator];
id object;
while ((object = [enumerator nextObject]) != nil)
{
// Do something with 'object'
}
3.快速遍历
NSArray *anArray = /* ... */;
for (id object in anArray)
{
// Do something with 'object'
}
4.块枚举法
- 这个块有三个参数,分别是当前迭代所针对的对象、所针对的下标,以及指向布尔值的指针。前两个参数的含义不言而喻。而通过第三个参数所提供的机制,开发者可以终止遍历操作
//1>NSArray
NSArray *anArray = /* ... */;
[anArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop)
{
// Do something with 'object'
if (shouldStop)
{
*stop = YES;
}
}];
//2>Dictionary
NSDictionary *aDictionary = /* ... */;
[aDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop)
{
// Do something with 'key' and 'object'
if (shouldStop)
{
*stop = YES;
}
}];
//3>Set
NSSet *aSet = /* ... */;
[aSet enumerateObjectsUsingBlock:^(id object, BOOL *stop)
{
// Do something with 'object'
if (shouldStop)
{
*stop = YES;
}
}];
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)options
usingBlock:(void(^)(id obj, NSUInteger idx, BOOL *stop))block;
- (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)options
usingBlock: (void(^)(id key, id obj, BOOL *stop))