美文网首页
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