有关enumerate、block遍历与NSEnumerator枚举器在NSString、NSArray、NSDictionary中的使用总结

来源:互联网 发布:手机浏览器查看源码 编辑:程序博客网 时间:2024/05/22 03:16


enumerateObjectsUsingBlock" 修改局部变量时, 你需要声明局部变量为 __block 类型.

enumerateObjectsWithOptions:usingBlock: 支持并发迭代或反向迭代,并发迭代时效率也非常高.
参考:http://blog.csdn.net/wm9028/article/details/51733308
NSArray的其他用法可参考:http://blog.csdn.net/quanqinyang/article/details/19555721

一:enumerate在NSString、NSArray、NSDictionary中的使用
参数说明:
使用block 块遍历整个数组,id obj 表示数组中的元素,NSUInteger idx 标示元素的下标,bool *stop 是一个bool类型的参数。
1、在NSString中

官方的方法:

NSString中:
  1. - (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString * __nullable substring, NSRange substringRange, NSRange enclosingRange, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  //在一定范围NSRange内按条件options读取

  2. - (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  //与 (for(... in ...)在效率上基本一致,有时会快些

//例如:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //    字符串  
  2.     NSString *filePath = [[NSBundle mainBundle] pathForResource:@"girl" ofType:@"txt"];  
  3.     NSData *fileData = [NSData dataWithContentsOfFile:filePath];  
  4.     NSString *fileStr = [[NSString alloc]initWithData:fileData encoding:NSUTF8StringEncoding];  
  5.       
  6.     //一行一行的读取  
  7.     [fileStr enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOLBOOL * _Nonnull stop) {  
  8.         NSLog(@"%@\n",line);  
  9.     }];  
  10.       
  11. //    一个字符一字符的读取 (NSStringEnumerationByWords
  12.     [fileStr enumerateSubstringsInRange:NSMakeRange(0, fileStr.length) options:NSStringEnumerationByWords usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOLBOOL * _Nonnull stop) {  
  13.         NSLog(@"tmp111===%@",substring);  
  14.     }];  

2、在NSArray中

官方提供的方法:

//enumerate枚举Block遍历数组法

NSArray中:
//数组有顺序
  1. - (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0); 
  2.  
  3. //排序的方式(多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历)
  4. - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0); 

  5. //NSIndexSet 参数标示,根据下标取出的数组,这里真正在block 中遍历的数组,是根据NSindexSet 取到的子数组
  6. - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  

例如:
  1. NSArray *array = @[@"a",@"1",@"2",@"3"];  
  2. //1.
  3. [arrayenumerateObjectsUsingBlock:^(id obj,NSUInteger index, BOOL* stop){
           NSLog(@"%@,%d",str,index);
       }];
  1.   /** 
  2.    NSEnumerationConcurrent 当前的排序状态 
  3.    NSEnumerationReverse    倒序排列 
  4.    */  
  5. //2.
  6.   [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {  
  7.   
  8.       NSLog(@"id ===%@\n",obj);  //倒叙枚举结果 3  2 1
  9.         
  10.   }]; 
  11. //3.
  12. [arrayenumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)]options:NSEnumerationReverseusingBlock:^(id str,NSUInteger index, BOOL* stop){
            NSLog(@"%@,%d",str,index);
        }]; 


3、在NSDictionary中

官方方法:

NSDictionary中:
//字典无顺序
  1. - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType key, ObjectType obj, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0); 
  2.  
  3. - (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(KeyType key, ObjectType obj, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  

例如:
  1.     NSDictionary *tmpdic = @{@"1":@"q",@"2":@"w"};  
  2. //1.    
  3. [tmpdic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOLBOOL * _Nonnull stop) {  
  4.         NSLog(@"tmpdis:key=%@ value=%@\n",key,obj);  
  5.     }];  
  6.       
  7.     /** 
  8.      NSEnumerationConcurrent 当前的排序状态 
  9.      NSEnumerationReverse    倒序排列 
  10.      */  
  11. //2.
  12.     [tmpdic enumerateKeysAndObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOLBOOL * _Nonnull stop) {  
  13.         NSLog(@"tmpdis2:key=%@ value=%@\n",key,obj);  //(字典是无顺序的)
  14.     }];  




二:NSEnumerator枚举器的用法

1、字典中的(有两个方法):
- (NSEnumerator<KeyType> *)keyEnumerator;//获取所有key值
- (NSEnumerator<ObjectType> *)objectEnumerator;//获取所有value值

示例:

        NSDictionary *myDic=[[NSDictionary alloc]initWithObjectsAndKeys:@"张三",@"name",@"李四",@"name", nil];
        NSUInteger count = myDic.count; 
        NSLog(@"词典的数量为:  %lu",count); 
     
        NSEnumerator * myEnumerator = myDic.keyEnumerator;//获取所有key值  
        for (NSObject *object in myEnumerator) { 
            NSLog(@"遍历KEY的值: %@",object); 
        }
NSString*key = [myDic.keyEnumeratornextObject];//keyEnumerator获取所有的Key值,nextObject逐个请求下一个对象
NSArray*temArray = myDic[key];  //jiangKey值对应的Value存放在数组中     
 
        NSEnumerator * myEnumerator  = [myDic allValues].objectEnumerator//获取所有value值
        NSString *value;
        while((value = [myEnumerator nextObject]))//下一个对象:nextObject
        {
            NSLog(@"遍历的值: %@",value);
        }
        
2、数组中的(有两个方法)
- (NSEnumerator<ObjectType> *)objectEnumerator;//正向遍历数组    ——>完全可用 for in 语法代替
- (NSEnumerator<ObjectType> *)reverseObjectEnumerator;//反向遍历数组,从后往前看

通过objectEnumerator向数组请求枚举器,如果想从后向前浏览集合,可使用reverseObjectEnumerator方法。在获得枚举器后,可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象:nextObject。nextObject返回nil值时,循环结束。示例如下:
    // NSEnumerator示例 //反向获取数组
    NSArray *array= [NSArray arrayWithObjects:@"112",@"234",@"3434",@"3455" ,nil];
    NSEnumerator *enumerator = [array reverseObjectEnumerator];//反向获取数组
// 方法一:
     id thing;
   while (thing = [enumerator nextObject]) {//下一个对象:nextObject
        NSLog(@"Ifound %@",thing);
    }
#if 0 //方法二
    NSArray *arr = [enumerator allObjects];
    for (NSString *res in arr) {
        NSLog(@"%@",res);
    }
#endif

0 0
原创粉丝点击