首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSEnumerator的价值是什么?

NSEnumerator的价值是什么?
EN

Stack Overflow用户
提问于 2010-03-07 05:03:09
回答 1查看 2.8K关注 0票数 2

什么时候去。。。在。。。是否可用?

具体地说,当我们可以写:

代码语言:javascript
复制
NSArray *array;
// array allocated and initialized here.
for (id obj in array) {
  // do something to the object here
}

我们为什么要用NSEnumerator呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-07 05:10:36

NSEnumerator是在快速枚举(for/in循环)可用之前创建的。如果您愿意,可以将其视为向后兼容。

但使用NSEnumerator时,您可以按自定义顺序枚举集合,例如向后:

代码语言:javascript
复制
NSEnumerator* enu = [array reverseObjectEnumerator];
id object;
while ((object = [enu nextObject])) {
 ...
}

(当然,由于NSEnumerator也支持for/in循环,您可以使用更好的方式:

代码语言:javascript
复制
for (id object in [array reverseObjectEnumerator]) {
  ...
}

)

或者通过继承NSEnumerator来定义你自己的迭代器类,例如

代码语言:javascript
复制
#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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2394089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档