【问题标题】:Easier way of getting the current loop number during for in loop?在 for in 循环期间获取当前循环号的更简单方法?
【发布时间】:2013-02-03 07:52:06
【问题描述】:

我正在编写一个for in 循环来从 NSArray 中读取名称列表,这是我的代码。

NSArray *names = [NSArray arrayWithObjects:@"Luke",@"James",@"Fred",@"Harry", nil];

for (NSString *name in names) {

    NSLog(@"%@",name);

}

我要确定的是是否有一种更简单的方法来获取当前循环号,而无需像这样在循环外添加变量..

int number = 0;

for (NSString *name in names) {

    number++;
    NSLog(@"%i - %@",number,name);

}

是否有可以在 for 循环期间访问的内置“循环编号”属性? - 我是不是找错树了?我应该只使用变量并克服它吗?

【问题讨论】:

    标签: objective-c for-in-loop


    【解决方案1】:

    您所做的事情是合理的(尽管我会将number++ 放在循环的末尾)。通常当我需要循环索引时,我会避免快速枚举并使用更传统的 for 循环:

    for (NSUInteger i=0; i<[names count]; i++) {
        NSString *name = names[i];
        NSLog(@"%i - %@", i, name);
    }
    

    【讨论】:

    • 干杯,for-in 真的很不错,但可惜它不像魔术@tom
    • @Wezly 实际上,汤姆是不对的。您可以获取对象的索引。看我的回答。
    • @H2CO3,我知道你来自哪里,虽然我有点希望从 for 循环中获取索引或循环号,而不是再次检查数组。
    【解决方案2】:

    如果您需要索引,请使用标准的 3 部分 for 循环,或带有 while 循环的 number 计数器。没有办法在for...in 样式循环中神奇地获取索引。

    【讨论】:

      【解决方案3】:

      这似乎有点不合时宜。您可以使用普通的 for 循环而不是快速枚举,或者使用块枚举对象,或者您也可以在 for 循环中使用 indexOfObject: 方法(但这确实是不鼓励,因为它仅当数组中只有唯一对象时才有效,并且无论如何重复查找会使其变慢)。总而言之,试试这个:

      int i;
      for (i = 0; i < names.count; i++) {
          NSString *name = [names objectAtIndex:i];
          // and "i" already stores the index
      }
      

      或者这个:

      [names enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
          // use obj and idx
      }];
      

      这也是可能的,但不要这样做:

      for (NSString *name in names) {
          int idx = [names indexOfObject:name];
          // etc.
      }
      

      【讨论】:

      • 但不要这样做.. 因为它比简单的int++; 慢?
      • @Wezly 差不多,是的,但主要是因为如果你在数组中有两次相同的对象,它就会被破坏:)
      • @H2CO3,是的,这(通常)会起作用,但这是一个非常蹩脚的解决方案,因为您最终会在每次通过循环时在数组中搜索当前元素。对于大型数组,这可能会真的变慢。
      • @AndrewMadsen 是的,基本上你会得到O(n ^ 2) 而不是O(n) - 如果NSArray 按我们预期的方式工作。 Too bad it doesn't.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2023-01-23
      • 2018-03-13
      • 2023-04-05
      • 2018-01-14
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多