迭代器设计模式的作用是:提供一种方法去访问集合对象中的元素,但是又不对外暴露底层的结构和实现细节。使得遍历集合元素的功能从集合对象本身转移到迭代器对象。
iOS上实现迭代器模式的方法:
1.NSEnumerator类,它是Foundation.framework中的一个类,遵循了NSFastEnumeration协议,需要实现- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len;方法。
使用方法如下:
NSArray *carArray = @[@"轩逸", @"奥迪Q5", @“传祺gs4”,@“雷凌”];
NSEnumerator *itemEnumerator = [carArray objectEnumerator];
NSString *carItem;
while (carItem = [itemEnumerator nextObject]) {
NSLog(@“current carItem = %@", carItem);
}
2.NSDictionary NSArray NSSet中的
-(void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);方法,从apple文档可以看出这个方法是iOS4及以上版本才支持。
使用方法如下:
NSArray *carArray = @[@"轩逸", @"奥迪Q5", @“传祺gs4”,@“雷凌”]; [carArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"carArray = %@", obj);
}];
- NSArray NSSet中的实例方法
- (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
(void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
这两个方法在swift中不可用,让数组每一个元素都调用指定的aSelector方法,withObject:是传递给aSelector的参数。
4.快速枚举,使用for枚举循环,比传统的基于索引的for循环高效。它是使用指针运算,相对比NSEnumerator高效。用于快速遍历的集合类需要遵循NSFastEnumeration协议。
使用方法如下:
NSArray *carArray = @[@"轩逸", @"奥迪Q5", @“传祺gs4”,@“雷凌”];
for(id car in carArray){
NSLog(@"carArray = %@", car);
}