RACTupleSequence
作为RACSequence
的子类,顾名思义,就是对元祖的操作,根据新增加的方法sequenceWithTupleBackingArray:offset:
可知,该类是对元祖的数组对象做处理。
完整测试用例在这里。
.m
中的方法如下:
+ (instancetype)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset {
NSCParameterAssert(offset <= backingArray.count);
if (offset == backingArray.count) return self.empty;
RACTupleSequence *seq = [[self alloc] init];
seq->_tupleBackingArray = backingArray;
seq->_offset = offset;
return seq;
}
创建RACTupleSequence
对象,保存参数值backingArray
offset
。
测试用例:
- (void)test_sequenceWithTupleBackingArray
{
RACTuple *tuple = RACTuplePack(@1, @2, @3);
RACSequence *sequence = [RACTupleSequence sequenceWithTupleBackingArray:tuple.allObjects offset:1];
NSLog(@"sequenceWithTupleBackingArray -- %@", sequence);
// 打印日志;
/*
2018-08-17 17:40:07.673830+0800 TestRACTupleSequence[52426:18393668] sequenceWithTupleBackingArray -- <RACTupleSequence: 0x600000236600>{ name = , tuple = (
1,
2,
3
) }
*/
}
- (id)head {
id object = self.tupleBackingArray[self.offset];
return (object == RACTupleNil.tupleNil ? NSNull.null : object);
}
获取tupleBackingArray
指定偏移量offset
下的值作为head
值。
测试用例:
- (void)test_head
{
RACTuple *tuple = RACTuplePack(@1, @2, @3);
RACSequence *sequence = [RACTupleSequence sequenceWithTupleBackingArray:tuple.allObjects offset:1];
NSLog(@"head -- %@", sequence.head);
// 打印日志;
/*
2018-08-17 17:41:34.131249+0800 TestRACTupleSequence[52496:18398390] head -- 2
*/
}
- (RACSequence *)tail {
RACSequence *sequence = [self.class sequenceWithTupleBackingArray:self.tupleBackingArray offset:self.offset + 1];
sequence.name = self.name;
return sequence;
}
通过sequenceWithTupleBackingArray:offset:
并将偏移量增加1
生成一个RACSequence
对象作为tail
值。
测试用例:
- (void)test_tail
{
RACTuple *tuple = RACTuplePack(@1, @2, @3);
RACSequence *sequence = [RACTupleSequence sequenceWithTupleBackingArray:tuple.allObjects offset:1];
NSLog(@"tail -- %@", sequence.tail);
// 打印日志;
/*
2018-08-17 17:42:32.102848+0800 TestRACTupleSequence[52540:18401646] tail -- <RACTupleSequence: 0x60000022c300>{ name = , tuple = (
1,
2,
3
) }
*/
}
- (NSArray *)array {
NSRange range = NSMakeRange(self.offset, self.tupleBackingArray.count - self.offset);
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:range.length];
[self.tupleBackingArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] options:0 usingBlock:^(id object, NSUInteger index, BOOL *stop) {
id mappedObject = (object == RACTupleNil.tupleNil ? NSNull.null : object);
[array addObject:mappedObject];
}];
return array;
}
通过tupleBackingArray
调用enumerateObjectsAtIndexes:
方法获取数组从指定偏移量offset
开始的所有数据,组成一个新的数组返回。
测试用例:
- (void)test_array
{
RACTuple *tuple = RACTuplePack(@1, @2, @3);
RACSequence *sequence = [RACTupleSequence sequenceWithTupleBackingArray:tuple.allObjects offset:1];
NSLog(@"array -- %@", sequence.array);
// 打印日志;
/*
2018-08-17 17:43:20.283402+0800 TestRACTupleSequence[52589:18404640] array -- (
2,
3
)
*/
}
所以该类的作用就是将元祖的数组转换成一个序列,通过序列的方法获取元祖的值。其实跟RACArraySequence
的方法非常相似,只是RACArraySequence
获取的值并不会做处理。而RACTupleSequence
会将RACTupleNil
类型转换为NSNull
类型,如果对RACTuple
有所了解,就会知道RACTuple
某种情况下会将NSNull
转为RACTupleNil
,这里的操作刚好是还原原始数据。
如果对RACTuple
不了解,请看这里。