美文网首页
iOS 遍历的几种使用方法(NSArray,NSDictiona

iOS 遍历的几种使用方法(NSArray,NSDictiona

作者: T_label | 来源:发表于2017-02-08 16:12 被阅读71次
  • 遍历数据,最常用的是for循环和快速遍历,也有其他比较陌生的方法,在这里做个记录以备所需。

    第一种:常用的for循环,c中也是经常使用
    例如:
    遍历数组
    NSArray *arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
    for (int i = 0; i < arr.count; i++) {
    NSLog(@"%@", arr[i]);
    }

    遍历字典
    NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
    NSArray *keyArr = [dic allKeys];
    for (int i = 0; i < keyArr.count; i++) {
          //根据键值处理字典中的每一项
          NSString *key = keyArr[i];
          NSString *value = dic[key];
          NSLog(@"%@", value);
    }
    

    第二种:快速遍历
    例如:

    遍历数组:
    NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
    for (NSString *str in arr) {
          NSLog(@"%@", str);
    }
    
    遍历字典:
    NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
    for (NSString *key in dic) {
          //处理字典的键值
          NSString *value = dic[key];
          NSLog(@"%@", value);
    }
    

反向遍历:

  for (NSString *obj in [arr reverseObjectEnumerator])

第三种:NSEnumerator(枚举查找)
NSEnumerator是一个抽象基类,其中定义了方法:
- (nullable ObjectType)nextObject;
nextObject 是其中最重要的方法,每次调用该方法会返回枚举中的下一个对象,直到返回nil。

例如:

  NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
  //正向遍历
  NSEnumerator *enumerator = [arr objectEnumerator];
  //反向遍历
  NSEnumerator *enumerator = [arr reverseObjectEnumerator];
  id object;
  while ((object = [enumerator nextObject]) != nil) {
        //处理枚举器中的数据
        NSLog(@"%@", object);
  }

第四种:基于block的遍历

遍历数组:

  NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
  [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
      NSLog(@"%@", obj);
      if ([obj isEqualToString:@"E"]) {
        *stop = YES;
      }
  }];

参数说明:obj表示数组中的元素,idx表示元素的下标,stop可以控制遍历何时停止,在需要停止时将stop = YES(注意前面的*不能忘)。

反向遍历:

  NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
  [arr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
      NSLog(@"%@", obj);
      if ([obj isEqualToString:@"E"]) {
          *stop = YES;
       }
  }];

遍历字典:

  NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
  [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
      NSLog(@"%@", obj);
      if ([obj isEqualToString:@"22"]) {
          *stop = YES;
      }
  }];

如果知道对象的数据类型,就可以检测是否调用了该对象不具有的方法。如:

  NSDictionary *dic = @{@"1":@"11", @"2":@"22", @"3":@"33"};
  [dic enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL * _Nonnull stop) {
      NSLog(@"%@", obj);
      if ([obj isEqualToString:@"22"]) {
          *stop = YES;
      }
  }];

并发遍历:

  NSArray * arr = @[@"0", @"1", @"2", @"3", @"4", @"5"];
  NSMutableArray *mutArr = [NSMutableArray arrayWithArray: arr];
  [mutArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSString *obj, NSUInteger idx, BOOL * _Nonnull stop) {
      obj = [NSString stringWithFormat:@"_%@", obj];
      [mutArr replaceObjectAtIndex:idx withObject:obj];
       NSLog(@"%@", obj);
       if ([obj isEqualToString:@"_I"]) {
          *stop = YES;
       }
  }];

相关文章

网友评论

      本文标题:iOS 遍历的几种使用方法(NSArray,NSDictiona

      本文链接:https://www.haomeiwen.com/subject/wcnvittx.html