如果这个问题非常简单,我深表歉意,但我已经疯狂地用谷歌搜索,无法找到合适的解释。
for (id line in self.lines){
[linesCopy addObject:[line copyWithZone:zone]];
}
我只是在学习 Objective-C,这是一种for
我以前从未见过的循环形式。我熟悉简单的
for (int x = 1, x < 10, x++)
for
循环样式。
如果这个问题非常简单,我深表歉意,但我已经疯狂地用谷歌搜索,无法找到合适的解释。
for (id line in self.lines){
[linesCopy addObject:[line copyWithZone:zone]];
}
我只是在学习 Objective-C,这是一种for
我以前从未见过的循环形式。我熟悉简单的
for (int x = 1, x < 10, x++)
for
循环样式。
快速枚举
几个 Cocoa 类,包括集合类,都采用了该
NSFastEnumeration
协议。您可以使用它使用类似于标准 C for 循环的语法来检索实例保存的元素,如以下示例所示:NSArray *anArray = // get an array; for (id element in anArray) { /* code that acts on the element */ }
顾名思义,快速枚举比其他形式的枚举更有效。
如果你不知道,id
是一个 Objective-C 类型,基本上意味着“指向任何 Objective-C 对象的指针”。请注意,它的指针id
是内置的;你通常不想说id *
。
如果您希望 的元素anArray
属于特定类,例如MyObject
,则可以改用它:
for (MyObject *element in anArray) {
/* code that acts on the element */
}
但是,编译器和运行时都不会检查元素是否确实是MyObject
. 如果 的元素anArray
不是的实例MyObject
,您可能最终会尝试向它发送一条它不理解的消息,并得到一个选择器无法识别的异常。
It's a statement that can be used with classes that are conform to NSFastEnumeration
protocol. When you have this available, the Objective-C programming guide suggest you to use it. Take a look here. It's a way to iterate over a collection without the traditional for (int i = 0; i < length; ++i)
syntax.
Mind that it doesn't usually support deleting and inserting elements while iterating through this way (also by using normal for
loops you should take care about indices in any case).
Basically all standard collections supports this way of iteration.
它是这种常见形式的简写形式:
for (int i = 0; i < [self.lines count]; i++) {
id line = [self.lines objectAtIndex:i];
// ...
}
这是一种常见的循环习惯用法(一次遍历某个集合、数组、集合等),它已被转换为这样的简写形式,称为“快速枚举”。
事实上,在它的内部实现中,它实际上比你自己做的要快一些,所以它在清晰度和性能上都更可取。
它称为forin
循环,也称为快速枚举。基本上,语法是:
for (SomeObjectIAmExpecting *localVariableName in anArrayOfObjects)
{
if (![localVariableName isKindOfClass:[SomeObjectIAmExpecting class]]) continue; //To avoid errors.
//do something to them
}