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_6, 4_0); //在一定范围NSRange内按条件options读取 - (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOLBOOL *stop))block NS_AVAILABLE(10_6, 4_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_6, 4_0); //排序的方式(多添加了一个参数,用来标示 是从前向后遍历,还是从后往前遍历) - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_6, 4_0); //NSIndexSet 参数标示,根据下标取出的数组,这里真正在block 中遍历的数组,是根据NSindexSet 取到的子数组 - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOLBOOL *stop))block NS_AVAILABLE(10_6, 4_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_6, 4_0); - (void)enumerateKeysAndObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(KeyType key, ObjectType obj, BOOLBOOL *stop))block NS_AVAILABLE(10_6, 4_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