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

    xiaoxiao2021-03-25  99

    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中: - (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读取 - (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  //与 (for(... in ...)在效率上基本一致,有时会快些 //例如:

    [objc]   view plain  copy   //    字符串       NSString *filePath = [[NSBundle mainBundle] pathForResource:@"girl" ofType:@"txt"];       NSData *fileData = [NSData dataWithContentsOfFile:filePath];       NSString *fileStr = [[NSString alloc]initWithData:fileData encoding:NSUTF8StringEncoding];              //一行一行的读取       [fileStr enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOLBOOL * _Nonnull stop) {           NSLog(@"%@\n",line);       }];          //    一个字符一字符的读取 (NSStringEnumerationByWords     [fileStr enumerateSubstringsInRange:NSMakeRange(0, fileStr.length) options:NSStringEnumerationByWords usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOLBOOL * _Nonnull stop) {           NSLog(@"tmp111===%@",substring);       }];  

    2、在NSArray中

    官方提供的方法:

    //enumerate枚举Block遍历数组法

    NSArray中: //数组有顺序 - (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);    //排序的方式(多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历) - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  //NSIndexSet 参数标示,根据下标取出的数组,这里真正在block 中遍历的数组,是根据NSindexSet 取到的子数组 - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_64_0);  

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

    3、在NSDictionary中

    官方方法:

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

    例如:     NSDictionary *tmpdic = @{@"1":@"q",@"2":@"w"};   //1.     [tmpdic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOLBOOL * _Nonnull stop) {           NSLog(@"tmpdis:key=%@ value=%@\n",key,obj);       }];              /**       NSEnumerationConcurrent 当前的排序状态       NSEnumerationReverse    倒序排列       */   //2.     [tmpdic enumerateKeysAndObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOLBOOL * _Nonnull stop) {           NSLog(@"tmpdis2:key=%@ value=%@\n",key,obj);  //(字典是无顺序的)     }];   二: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
    转载请注明原文地址: https://ju.6miu.com/read-10818.html

    最新回复(0)