Objective-C中的For循环

69

我应该在哪里使用for循环,而在哪里使用for in循环?

我想了解它们之间的区别。

2个回答

147

Objective-C中传统的for循环继承自标准C,形式如下:

for (/* Instantiate local variables*/ ; /* Condition to keep looping. */ ; /* End of loop expressions */)
{
    // Do something.
}
例如,要打印从1到10的数字,您可以使用for循环:
for (int i = 1; i <= 10; i++)
{
    NSLog(@"%d", i);
}

另一方面,for in循环是在Objective-C 2.0中引入的,用于遍历集合中的对象,例如一个NSArray实例。例如,要循环遍历NSArray中的一组NSString对象并将它们全部打印出来,可以使用以下格式。

for (NSString* currentString in myArrayOfStrings)
{
    NSLog(@"%@", currentString);
}

这在逻辑上等价于以下传统的for循环:

for (int i = 0; i < [myArrayOfStrings count]; i++)
{
    NSLog(@"%@", [myArrayOfStrings objectAtIndex:i]);
}

使用 for-in 循环的优点首先在于它更加清晰易懂。其次,Objective-C 编译器可以对 for-in 循环进行优化,使代码比使用传统的 for 循环更快运行。


2
@koregan:当你改述问题时,请添加一条评论请求James更改第一句话。您还可以添加一条评论,更加包容非英语母语的人... - Stefan Steinegger
在 Objective-C 中,循环语句是 for (element in collection) 而不是 for (element : collection)。此外,collection 可以是任何实现了 NSFastEnumeration 的对象。 - JeremyP
啊,对不起-我已经编辑过了。我也同意关于NSFastEnumeration评论的观点。谢谢。 :) - James Bedford
在以下代码 NSArray *myArray = [self generateArray]; for (NSString *currentString in myArray)for (NSString *currentString in [self generateArray]) 中,是否有明显的性能差异? - vivek241
不,你只是多做了一个声明(这并不昂贵),编译器可以轻松优化它。 - James Bedford

9
你是指快速枚举吗?你的问题表述不太清楚。
一个普通的for循环看起来会像这样:
unsigned int i, cnt = [someArray count];
for(i = 0; i < cnt; i++)
{ 
   // do loop stuff
   id someObject = [someArray objectAtIndex:i];
}

使用快速枚举的循环,编译器会进行优化,代码如下:
for(id someObject in someArray)
{
   // do stuff with object
}

请记住,在使用快速枚举时,您不能更改正在使用的数组,因此不能添加或删除元素。


1
这个规则的一个例外是,可以在循环体内进行一次更改(例如,删除你正在查找的项),但立即使用“break”退出循环。 - Scott Lahteine
@ScottLahteine 我其实怀疑这一点,因为当你尝试改变数组时会抛出异常。 - Antwan van Houdt
您可以枚举可变数组。有关示例,请参见ADC中TableViewPlayground示例代码中ATApplicationController.m的_windowClosed:方法。 - Scott Lahteine
1
@ScottLahteine与其是否为可变数组无关,但我尝试改变了数组并在此之后立即打破了循环,似乎一切正常--所以你的第一个评论是正确的。 编辑我没有查看ATAApplicationController的代码,而是编写了自己的示例。 - Antwan van Houdt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接