NSEnumerator簡單初探

一、簡介

像NSArray、NSSet、NSDictionary等集合類均可獲取到NSEnumerator, 該類是一個抽象類,沒有用來創建實例的公有接口。NSEnumerator的nextObject方法可以遍歷每個集合元素,結束返回nil,通過與while結合使用可遍歷集合中所有項。

二、使用解析

1、NSArray中使用到的NSEnumerator,代碼如下:

- (void)addArrayBtn{
    UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(0, 200, 300, 50);
    CGPoint btnCenter = CGPointMake(self.view.center.x, btn.frame.origin.y + 25);
    btn.center = btnCenter;
    btn.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:btn];
    [btn setTitle:@"NSArray中NSEnumerator用法" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(didClickArrayBtn) forControlEvents:UIControlEventTouchUpInside];
}

- (void)didClickArrayBtn{
    /*
     - (NSEnumerator<ObjectType> *)objectEnumerator;       //正向遍歷數組
     - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;//反向遍歷數組
     */
    NSArray *array = @[@"hehe",@"xixi",@"heihei",@"wuwu",@"lala",@"haha"];
    NSEnumerator *enumerator = [array objectEnumerator];
    NSString *obj;
    while (obj = [enumerator nextObject]) {
        NSLog(@"數組正序值開始打印:%@\n",obj);
    }
    NSEnumerator *reverseEnumerator = [array reverseObjectEnumerator];
    id reverseObj;
    while (reverseObj = [reverseEnumerator nextObject]) {
        NSLog(@"數組逆序值開始打印:%@\n",reverseObj);
    }
}

2、NSDictionary中NSEnumerator的使用,代碼如下:

- (void)addDictionaryBtn{
    UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(0, 300, 300, 50);
    CGPoint btnCenter = CGPointMake(self.view.center.x, btn.frame.origin.y + 25);
    btn.center = btnCenter;
    btn.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:btn];
    [btn setTitle:@"NSDictionary中NSEnumerator用法" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(didClickDictionaryBtn) forControlEvents:UIControlEventTouchUpInside];
}

- (void)didClickDictionaryBtn{
    /*
     - (NSEnumerator<KeyType> *)keyEnumerator;//獲取所有key值
     - (NSEnumerator<ObjectType> *)objectEnumerator;//獲取所有value值
     */
    
    NSDictionary *dict = @{@"name":@"zhangsan",@"age":@(18),@"height":@(173.5)};
    NSEnumerator *keyEnumerator = [dict keyEnumerator];
    NSString *key;
    while (key = [keyEnumerator nextObject]) {
        NSLog(@"字典key值開始打印:%@\n",key);
    }
    NSEnumerator *objEnumerator = [dict objectEnumerator];
    id obj;
    while (obj = [objEnumerator nextObject]) {
        NSLog(@"字典value值開始打印:%@\n",obj);
    }
}

3、NSSet中NSEnumerator的使用,代碼如下:

- (void)addSetBtn{
    UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(0, 400, 300, 50);
    CGPoint btnCenter = CGPointMake(self.view.center.x, btn.frame.origin.y + 25);
    btn.center = btnCenter;
    btn.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:btn];
    [btn setTitle:@"NSSet中NSEnumerator用法" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(didClickSetBtn) forControlEvents:UIControlEventTouchUpInside];
}

- (void)didClickSetBtn{
    /*
     - (NSEnumerator<ObjectType> *)objectEnumerator; //獲取所有元素的值,并且是無序的
     */
    NSSet *set = [[NSSet alloc]initWithObjects:@"hehe",@"xixi",@"heihei",@"wuwu",@"lala",@"haha",nil];
    NSEnumerator *enumerator = [set objectEnumerator];
    
    id obj;
    while (obj = [enumerator nextObject]) {
        NSLog(@"NSSet中value值開始打印:%@\n",obj);
    }
}

4、看打印效果,在ViewController中添加這三個Btn即可點擊后打印:
代碼:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addArrayBtn];
    [self addDictionaryBtn];
    [self addSetBtn];
}

打印效果:

Snip20170505_70.png
三、其他擴展

1、針對于NSEnumerator這個類文件相關內容如下

typedef struct {
    unsigned long state;
    id __unsafe_unretained _Nullable * _Nullable itemsPtr;
    unsigned long * _Nullable mutationsPtr;
    unsigned long extra[5];
} NSFastEnumerationState;

@protocol NSFastEnumeration

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained _Nullable [_Nonnull])buffer count:(NSUInteger)len;

@end

@interface NSEnumerator<ObjectType> : NSObject <NSFastEnumeration>

- (nullable ObjectType)nextObject;

@end

@interface NSEnumerator<ObjectType> (NSExtendedEnumerator)

@property (readonly, copy) NSArray<ObjectType> *allObjects;

@end

其中有一個協議NSFastEnumeration,實現這個協議的方法就可以實現快速遍歷,集合類都遵守了此協議,所以集合都能夠實現快速遍歷,具體該怎么使用請看貼文

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容