EasySequence 是一个强大的基础库,用于处理序列类型,如数组、集合、字典。任何符合 NSFastEnumeration 协议的对象都可以初始化为 EZSequence 实例,然后您可以对其进行操作。最后,您可以将其转换回原始类型。
要求
iOS 8.0 或更高版本。
安装
EasySequence 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'EasySequence'
要运行示例项目,克隆仓库,然后首先从 Example 目录运行 pod install
。
功能
创建
- 可以初始化自任何符合
NSFastEnumeration
协议的对象。
枚举
- 使用
forEach:
进行枚举 - 使用
forEachWithIndex:
进行枚举 - 使用快速枚举
- 使用NSEnumerator进行枚举
操作
- 映射
- 扁平化映射
- 过滤
- 选择
- 拒绝
- 取
- 跳过
- 任何
- 连接
- 归约
- 按组
- 第一个对象
- 第一个匹配条件对象
- 第一个索引位置
转移
- 符合
EZSTransfer
协议的对象可以获取从EZSequence
转移的实例。
线程安全类型
我们提供以下线程安全类型
- EZSArray
- EZSWeakArray
- EZSOrderedSet
- EZSWeakOrderedSet
- EZSQueue
弱引用容器
EZSWeakArray
和EZSWeakOrderedSet
对其元素的引用为弱引用。
示例
创建序列
EZSequence 类型代表了一种特定的顺序,是用来表示相关对象或对象之间跟随关系的序列。例如,NSStringArray 或 NSSet 比 EZSequence 不仅是序列。
EZSequence 可以从遵守 NSFastEnumeration 协议的任何对象初始化。
NSArray *array = @[@1, @2, @3];
EZSequence *sequence = [[EZSequence alloc] initWithOriginSequence:array];
枚举
- 使用快速枚举进行枚举
EZSequence *sequence = [[EZSequence alloc] initWithOriginSequence:@[@1, @2, @3]];
NSMutableArray *receive = [NSMutableArray array];
for (id item in sequence) {
[receive addObject:item];
}
- 使用 NSEnumerator 进行枚举
EZSequence<NSNumber *> *sequence = [[EZSequence alloc] initWithOriginSequence:@[@1, @2, @3]];
NSMutableArray<NSNumber *> *receive = [NSMutableArray array];
NSEnumerator<NSNumber *> *enumerator = [sequence objectEnumerator];
for (id item in enumerator) {
[receive addObject:item];
}
- 基于 block 的枚举
EZSequence<NSNumber *> *sequence = [[EZSequence alloc] initWithOriginSequence:@[@1, @2, @3]];
NSMutableArray *receive = [NSMutableArray array];
[sequence forEach:^(NSNumber *item) {
[receive addObject:item];
}];
[sequence forEachWithIndex:^(NSNumber * _Nonnull item, NSUInteger index) {
[receive addObject:item];
}];
[sequence forEachWithIndexAndStop:^(NSNumber * _Nonnull item, NSUInteger index, BOOL * _Nonnull stop) {
if (index == 2) {
*stop = YES;
}
[receive addObject:item];
}];
操作
- 映射
EZSequence<NSString *> *sequence = EZS_Sequence(@[@"111", @"222", @"333"]);
EZSequence<NSNumber *> *mappedSequence = [sequence map:^id _Nonnull(NSString * _Nonnull value) {
return @(value.integerValue);
}];
// mappedSequence => @111, @222, @333
- 选择
EZSequence<NSNumber *> *sequence = [@[@1, @2, @3, @4, @5, @6] EZS_asSequence];
EZSequence<NSNumber *> *oddNumbers = [sequence select:^BOOL(NSNumber * _Nonnull value) {
return value.integerValue % 2 == 1;
}];
// oddNumbers => @1, @3, @5
- 过滤
EZSequence *seq = EZS_Sequence(@[@"1", @"2", @"3", @"4", @"5"]);
EZSequence *filteredSeq = [seq filter:EZS_not(EZS_isEqual(@"4"))];
// filteredSeq = > @"1", @"2", @"3", @"5"
- 连接
NSArray *a = @[@1, @2, @3];
NSArray *b = @[@"a", @"b"];
EZSequence<EZSequence *> *zippedSeq = [EZSequence zip:@[a, b]];
// zippedSeq => @[@1, @"a"], @[@2, @"b"]
更多信息和使用帮助,请参阅我们的单元测试和 API 注释。
传输协议
符合EZSTransfer
协议的对象可以获取从EZSequence
转移的实例。
EZSequence *sequence = [[EZSequence alloc] initWithOriginSequence:@[@1, @2, @3, @2]];
// transfer to a `NSArray`
NSArray *array = [sequence as:NSArray.class];
// array => @1, @2, @3, @2
// transfer to a `NSSet`
NSSet *set = [sequence as:NSSet.class];
// set => @1, @2, @3
// transfer to a `NSOrderedSet`
NSOrderedSet *orderedSet = [sequence as:NSOrderedSet.class];
// orderedSet => @1, @2, @3
作者
张伟,[email protected]
姜沂,[email protected]
秦红,[email protected]
SketchK,[email protected]
许可协议
EasySequence 以 MIT 许可协议提供。有关更多信息,请参阅 LICENSE 文件。