2

いつのために。。。の 。。。利用可能です?

具体的には、次のように書くことができます。

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

なぜNSEnumeratorを使用するのでしょうか。

4

1 に答える 1

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 をサブクラス化して独自の反復子クラスを定義します。

#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;
}
于 2010-03-06T21:10:35.653 に答える