【问题标题】:What is the value of NSEnumerator?NSEnumerator 的值是多少?
【发布时间】: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?

【问题讨论】:

    标签: objective-c nsenumerator


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2012-03-06
      • 2017-11-13
      • 1970-01-01
      相关资源
      最近更新 更多