一、簡介
像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,實現這個協議的方法就可以實現快速遍歷,集合類都遵守了此協議,所以集合都能夠實現快速遍歷,具體該怎么使用請看貼文