CCARRAY_FOREACH是Cocos2d-x中经常被用到的一个宏,它提供了对__Array的正向遍历。
CCARRAY_FOREACH的定义如下:
#define CCARRAY_FOREACH(__array__, __object__) \
if ((__array__) && (__array__)->data->num > 0) \
for(Ref** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr + (__array__)->data->num-1;\
__arr__ <= __end__ && (((__object__) = *__arr__) != NULL/* || true*/);\
__arr__++)
首先判断数组是否存在以及数组元素个数是否大于零。
然后在for循环的初始化语句中,__arr__是一个二重指针被定义指向数组__array__,指向数组的名字就是指向数组的第一个元素,所以__arr__就是指向了数组__array__的第一个元素。__end__则是指向了数组__array__的最后一个元素。在for循环的循环条件中,比较__arr__与__end__,然后将当前__arr__指向的元素赋值给变量__object__,赋值运算符返回一个左边变量的指针,通过判断其是否为NULL来判断赋值是否成功。最后在for循环的表达式中,将__arr__自加,作用是将指针后移。
通过以上分析,可以发现CCARRAY_FOREACH跟C++11中的范围for很类似,用法也类似,只不过参数中的__object__需要在前面定义完成。
CCARRAY_FOREACH的基本用法如下:
__Array* array = __Array::create();
Ref* obj;
CCARRAY_FOREACH(array, obj){
//调用obj进行操作
}
范围for的基本用法如下:
std::string str("Hello World");
for(auto c : str){
std::cout<< c <<std::endl;
}
可以发现用法基本是一样的,所以就把
CCARRAY_FOREACH当成范围for去用就可以。