2010-03-06 20 views
2

當。 。 。中。 。 。可用?NSEnumerator的值是什麼?

具體而言,當我們可以這樣寫:

NSArray *array; 
// array allocated and initialized here. 
for (id obj in array) { 
    // do something to the object here 
} 

爲什麼我們曾經使用NSEnumerator?

回答

5

NSEnumerator創建之前快速枚舉(for/in循環)可用。如果你願意,可以把它看作是向後兼容的。

但是使用NSEnumerator,您可以按照自定義的順序來枚舉集合,例如向後:

NSEnumerator* enu = [array reverseObjectEnumerator]; 
id object; 
while ((object = [enu nextObject])) { 
... 
} 

(當然,因爲NSEnumerator還支持for/in循環可以使用更好的方法:

for (id object in [array reverseObjectEnumerator]) { 
    ... 
} 

或通過繼承NSEnumerator定義自己的iterator類,例如

#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; 
}