【发布时间】:2011-01-24 13:04:22
【问题描述】:
当 . . .在 。 . .有货吗?
具体来说,什么时候可以写:
NSArray *array;
// array allocated and initialized here.
for (id obj in array) {
// do something to the object here
}
我们为什么要使用 NSEnumerator?
【问题讨论】:
当 . . .在 。 . .有货吗?
具体来说,什么时候可以写:
NSArray *array;
// array allocated and initialized here.
for (id obj in array) {
// do something to the object here
}
我们为什么要使用 NSEnumerator?
【问题讨论】:
NSEnumerator 创建于之前快速枚举(for/in 循环)可用。如果您愿意,可以将其视为向后兼容。
但是使用 NSEnumerator 您可以按自定义顺序枚举集合,例如向后:
NSEnumerator* enu = [array reverseObjectEnumerator];
id object;
while ((object = [enu nextObject])) {
...
}
(当然,由于 NSEnumerator 也支持 for/in 循环,你可以使用更好的方式:
for (id object in [array reverseObjectEnumerator]) {
...
}
)
或者通过继承 NSEnumerator 来定义你自己的迭代器类,例如
#import <Foundation/Foundation.h>
@interface RangeEnumerator : NSEnumerator {
int cur, len;
}
+(RangeEnumerator*)enumeratorWithLength:(int)length;
-(id)initWithLength:(int)length;
-(id)nextObject;
@end
@implementation RangeEnumerator
-(id)initWithLength:(int)length {
if ((self = [super init]))
len = length;
return self;
}
+(RangeEnumerator*)enumeratorWithLength:(int)length {
return [[(RangeEnumerator*)[self alloc] initWithLength:length] autorelease];
}
-(id)nextObject {
if (cur < len)
return [NSNumber numberWithInt:cur++];
else
return nil;
}
@end
int main () {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
for (NSNumber* num in [RangeEnumerator enumeratorWithLength:12])
printf("%d\n", [num intValue]);
[pool drain];
return 0;
}
【讨论】: