遍历一个容器内所有的元素,是在开发过程中很常见的操作。在 Objc 中常用的有 C style loop(据说在 swift 3 中已不再支持)、Block style enumerate、NSEnumerator 和 for in style。前两种比较简单这里不再赘述,先简单谈一下 NSEnumerator。
NSEnumerator 是一个抽象类,只有两个方法,-(NSArray*)allobjects
和 -(id)nexObject
。你必须继承 NSEnumerator 然后使用子类的实例,在内部实现中使用自定义的状态值来记住当前遍历的状态,以便实现 -(id)nextObject
方法,如果你得容器类存放的数据是有序的,这个状态值可以是当前遍历到的元素的序号;当-(id)nexObject
返回 nil
的时候遍历结束。-(NSArray*)allObjects
不是一定要实现的,NSEnumerator 提供了一个默认的实现,既循环执行 -(id)nexObject
把返回的 object 塞到一个 NSMutableArray 里面,为了效率考虑可以根据情况自己提供更快的实现。
如果不关心 index 的话,for in style 的遍历是一种更方便的写法,也是遍历速度“最快”的,毕竟只有遵循 NSFastEnumeration
协议的才能这样遍历。NSArray , NSDictionary , NSSet 都实现了这个协议。
for (NSNumber *number in array) {
//do something
}