2010-03-06 2 views
2

의 경우. . . 인치 . . 사용할 수 있습니다?NSEnumerator의 값은 무엇입니까?

특히, 우리가 쓸 수있는 경우 :

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

우리는 왜 이제까지 NSEnumerator를 사용해야합니까?

답변

5

NSEnumerator가 으로 만들어졌습니다. 빠른 열거 형 (in/in 루프)을 사용할 수 있습니다. 원하면 이전 버전과의 호환성이라고 생각하십시오.

NSEnumerator를 사용하면 사용자 지정된 순서로 컬렉션을 열거 할 수 있습니다. 뒤로 :

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

(물론, NSEnumerator는 루프에서 당신이 더 나은 방법을 사용할 수 있습니다에 대한/지원하기 때문에 :

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