【问题标题】:fast enumeration for loop - Is there a counter?循环的快速枚举 - 有计数器吗?
【发布时间】:2013-06-19 06:53:22
【问题描述】:

在常规的for 循环中,我可以使用i 作为for 循环内的计数器。我怎么知道上面的计数?

for(int i=0;i<[someArray count];i++)
{
   bla = [arrayExample objectAtIndex:i];
}

for(id someObject in someArray)
    {
       bla = [arrayExample objectAtIndex:??];
    }

【问题讨论】:

  • 为此我通常使用enumerateObjectsUsingBlock:
  • 这个“问题”真的有那么难弄清楚吗?如果这对您来说太难了,那么当您尝试解决实际问题时,您会感到震惊……
  • @trojanfoe 没有人说这很困难。我的问题从 Is there 开始。
  • @MaxGabriel 谢谢....
  • 这是一个合法的问题。例如,python 中的答案是使用enumerate。也许对于 C 程序员来说,这甚至不是一个小烦恼,而是来自 Python,至少,我不愿意自己跟踪索引!

标签: ios objective-c


【解决方案1】:

您可以使用普通的 for 循环,也可以在当前的快速枚举中添加一个计数器。

这仍然具有快速枚举的优势,同时还包括您当前所在的索引。

int index = 0;

for (id element in someArray) {
    //do stuff
    ++index;
}

更好的是使用快速枚举块方法...

[someArray enumerateWithUsingBlock:^(id element, NSUInteger idx, BOOL stop) {
    // you can do stuff in here.
    // you also get the current index for free
    // idx is the index of the current object in the array
}];

【讨论】:

  • 如果你有continues,你必须在所有这些中手动增加index
  • 给你 +1 只是因为我不喜欢接受的答案,而且我见过你足够多的时间知道你是可靠的。好代码。
【解决方案2】:
 [animationKey addObject:@"cameraIris"];
    [animationKey addObject:@"cameraIrisHollowOpen"];
    [animationKey addObject:@"cameraIrisHollowClose"];
    [animationKey addObject:@"cube"];
    [animationKey addObject:@"alignedCube"];
    [animationKey addObject:@"flip"];
    [animationKey addObject:@"alignedFlip"];
    [animationKey addObject:@"oglFlip"];
    [animationKey addObject:@"rotate"];
    [animationKey addObject:@"pageCurl"];
    [animationKey addObject:@"pageUnCurl"];

  //////////////////////////////////

    [animationKey enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *animationType = obj;

        NSLog(@"Animation type #%d is %@",idx,animationType);

    }];

对于您的情况:-

试试这样...

[someArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

           bla = [someArray objectAtIndex:idx];

        }];

【讨论】:

  • 啊,不错,看来这实际上是最好的答案。
【解决方案3】:

你不能。或者更好的是,您可以使用外部计数器并在每个周期手动递增它,但是使用“经典”会更容易。

【讨论】:

  • 这可能更容易,但比使用快速枚举和使用自己的索引要慢很多。
  • 为什么要引入比可能慢的代码。它可能不是瓶颈,但是当您可以轻松地使用快速的东西时,为什么还要使用缓慢的东西。
  • 嗯,我们所说的差异对性能的影响很小,我不会谈论“快”和“慢”。这可能更多的是风格问题。恕我直言,如果您需要循环中当前对象的索引,请选择“经典” for,否则请随意使用快速枚举。我不会责怪那些根本不使用快速枚举的人,即使他们并不真正需要对象的索引。恕我直言。
  • 哇!这被采纳了?一个直接错误的答案。这甚至不是“这可能是一种方法”的答案。这是完全错误的。
【解决方案4】:

您尝试做的有点反对快速枚举的想法。 快速枚举使用“for-all”一词。也就是说,您不关心元素的顺序或数量。 经典的 for 正是为您想要的而设计的。

【讨论】:

  • 数组的元素是有序的,具有快速的枚举循环。
  • 是的。但我的意思是你并不在乎。但你是对的,订单就在那里。
【解决方案5】:

你为什么要这样做?你已经拥有这个对象someObject

无论如何,如果你想要当前索引,你可以做以下

for (id someObject in someArray)
{
    int index = [someArray indexOfObject:element];
}

但这看起来没什么用,因为在这种情况下为什么要使用快速枚举?

更多查询数组的方法见https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

【讨论】:

  • 你不必检查containsObject:;你已经从数组中取出对象了!另请注意,indexOfObject: 只会返回 first 索引。如果您有多个比较相等的对象(NSNull 是这里的主要候选对象),您将获得所有对象的相同索引。
  • 你说得对,条件是不需要的。为了安全起见,我习惯于使用indexOfObject:containsObject:,但我想这不是真正的用例:)
  • 什么使它不安全,当不使用containsObject时?这里的引用是从数组中获取的
  • -1:这会将您的O(n) 循环变成O(n^2) 循环......而且并不总是正确的。
【解决方案6】:

[arrayExample objectAtIndex:i] 用于获取数组中该索引处的对象实例作为引用,快速枚举在循环本身中执行,因为它返回数组中对象的引用

for(id someObject in someArray)
{
   bla =(BlaClass *)someObject;
}

for(BlaClass *someObject in someArray)
{ 
  //someobject is the reference ,just use it

}

【讨论】:

  • 你可以直接使用BlaClass而不是id,那么就不需要强制转换然后使用someObject作为参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多