定义
提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示
场景
需要实现自己的容器类,且要迭代里面的元素
实现
IOS中有现成的迭代的接口NSEnumerator,直接使用而不需要重新创建。
1、UML图
迭代器.png
2、使用
- 创建原始对象类
@interface Student : NSObject
@property(nonatomic, copy)NSString *name;
-(instancetype)initWithName:(NSString *)name;
@end
#import "Student.h"
@implementation Student
- (instancetype)initWithName:(NSString *)name
{
self = [super init];
if (self) {
self.name = name;
}
return self;
}
@end
- 创建容器类
#import <Foundation/Foundation.h>
#import "Student.h"
NS_ASSUME_NONNULL_BEGIN
@interface Grade : NSObject
-(void)addStudent:(Student *)student;
-(void)removeStudent:(Student *)student;
-(NSEnumerator<Student*>*)objectEnumerator;
@end
NS_ASSUME_NONNULL_END
#import "Grade.h"
#import "GradeEnumerator.h"
@interface Grade()
@property(nonatomic, strong)NSMutableArray *array;
@end
@implementation Grade
- (instancetype)init
{
self = [super init];
if (self) {
self.array = [[NSMutableArray alloc] init];
}
return self;
}
- (void)addStudent:(Student *)student{
[self.array addObject:student];
}
- (void)removeStudent:(Student *)student{
for(Student *stu in self.array){
if([stu.name isEqualToString:student.name]){
[self.array removeObject:stu];
break;
}
}
}
- (NSEnumerator<Student *> *)objectEnumerator{
return [[GradeEnumerator alloc] initGradeWithStudents:self.array];
}
@end
- 创建迭代器类
@interface GradeEnumerator : NSEnumerator<Student*>
-(instancetype)initGradeWithStudents:(NSArray<Student*>*)array;
@end
#import "GradeEnumerator.h"
@interface GradeEnumerator()
@property(nonatomic, strong)NSArray<Student*> *array;
@property(nonatomic, assign)int index;
@end
@implementation GradeEnumerator
- (instancetype)initGradeWithStudents:(NSArray<Student *> *)array{
self = [super init];
if (self) {
self.array = array;
self.index = 0;
}
return self;
}
- (Student *)nextObject{
Student *value = nil;
if(self.index < self.array.count){
value = self.array[self.index];
self.index ++;
}
return value;
}
@end
- Client调用
Student *bob = [[Student alloc] initWithName:@"bob"];
Student *lily = [[Student alloc] initWithName:@"lily"];
Grade *grade = [[Grade alloc] init];
[grade addStudent:bob];
[grade addStudent:lily];
//遍历
Student *student;
NSEnumerator *enumerator = [grade objectEnumerator];
while (student = [enumerator nextObject]) {
NSLog(@"student name:%@", student.name);
}
总结
类要支持迭代,而又不暴露其内部接口,可使用该模式。
代码
链接: https://pan.baidu.com/s/1h79yRgiluYgJPqvmWqTDWA 提取码: fr3t