我不熟悉的循环奇怪:"for(id*in*)"

Rob*_*Rob 2 for-loop objective-c fast-enumeration

如果这个问题非常简单,我很抱歉,但我已经用Google搜索过疯狂,无法找到合适的解释.

for (id line in self.lines){
    [linesCopy addObject:[line copyWithZone:zone]];
}
Run Code Online (Sandbox Code Playgroud)

我只是在学习Objective-C,这是一种for我以前从未见过的循环形式.我对这个简单很熟悉

for (int x = 1, x < 10, x++)
Run Code Online (Sandbox Code Playgroud)

for循环的风格.

rob*_*off 11

来自可可核心能力:枚举:

快速枚举

几个Cocoa类,包括集合类,采用该NSFastEnumeration协议.您可以使用它来使用类似于标准C for循环的语法来检索实例持有的元素,如以下示例所示:

NSArray *anArray = // get an array;
for (id element in anArray) {
    /* code that acts on the element */
}
Run Code Online (Sandbox Code Playgroud)

顾名思义,快速枚举比其他形式的枚举更有效.

如果您不知道,id是Objective-C类型,基本上意味着"指向任何Objective-C对象的指针".请注意,指针id内置于其中; 你通常不会想说id *.

如果您希望元素anArray属于特定类,比如说MyObject,您可以使用它:

for (MyObject *element in anArray) {
    /* code that acts on the element */
}
Run Code Online (Sandbox Code Playgroud)

但是,编译器和运行时都不会检查元素是否确实是实例MyObject.如果一个元素anArray没有的一个实例MyObject,你可能最终会试图发送一个消息,它不理解,并得到一个选择-不承认例外.