NSIndexSet
NSIndexSet 是个无符号整数集合。集合中的元素不可变的、不可重复。常被用来当作索引使用。就从它字面上理解,就叫做:索引集合。
NSIndexSet可以用来存储一系列的索引值区间,索引值可以使用单个的NSUInteger或者NSRange来表示。而且和许多其他集合类型一样,它有不可变和可变的执行,分别对应NSIndexSet类型和NSMutableIndexSet类型。NSIndexSet可以通过一个NSUinteger,NSRange或者另一个NSIndexSet来创建。也可以使用NSMutableIndexSet来多次添加NSUinteger或者NSRange对象。
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和3
[idxSet addIndex:5];
[idxSet addIndex:3];
//添加1-4
[idxSet addIndexesInRange:NSMakeRange(1, 4)];
[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
{
NSLog(@"%lu", (unsigned long)idx);
}];
//注:数值有重叠不会被重复输出
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//添加7-10
[idxSet addIndexesInRange:NSMakeRange(7, 4)];
//idxSet包含的区间:2, 5, 7 - 10
//取交集:3 – 8
/*
enum {
NSEnumerationConcurrent = (1UL << 0), //并发,顺序不确定
NSEnumerationReverse = (1UL << 1), //倒叙,顺序确定
};
*/
[idxSet enumerateIndexesInRange:NSMakeRange(3, 6) options:NSEnumerationConcurrent usingBlock:^(NSUInteger idx, BOOL *stop)
{
NSLog(@"%lu", (unsigned long)idx);
}];
是否包含一个NSIndexSet,找到相邻最大或等于的索引值
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//判断是否包含3 - 5
NSLog(@"%d", [idxSet containsIndexesInRange:NSMakeRange(2, 2)]);
//从4起找到最近的等于或者大于的索引值
NSLog(@"%lu", (unsigned long)[idxSet indexGreaterThanOrEqualToIndex:4]);
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
//添加5和2
[idxSet addIndex:5];
[idxSet addIndex:2];
//添加7-10
[idxSet addIndexesInRange:NSMakeRange(7, 4)];
//从NSRange的交集中倒着枚举
NSIndexSet *subSet = [idxSet indexesInRange:NSMakeRange(3, 6) options:NSEnumerationReverse passingTest:^BOOL(NSUInteger idx, BOOL *stop){
NSLog(@"> %lu", (unsigned long)idx);
if (idx > 5) {
return YES;
}
return 0;
}];
[subSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop)
{
NSLog(@"%lu", (unsigned long)idx);
}];
- (NSIndexSet *)indexesInRange:(NSRange)range options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(NSUInteger idx,BOOL *stop))predicate NS_AVAILABLE(10_6,4_0);
而不是
- (NSUInteger)indexInRange:(NSRange)range options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(NSUInteger idx,BOOL *stop))predicate NS_AVAILABLE(10_6,4_0);
NSMutableIndexSet *set = [[NSMutableIndexSet alloc]init];
[set addIndexesInRange:NSMakeRange(1, 2)];
NSArray *arr = @[@"1",@"2",@"3",@"4",@"5"];
NSArray *arr2 = [arr objectsAtIndexes:set];
NSLog(@"%@",arr2);
NSValue
一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存任意类型的数据,比如int,float,char,当然也可以是指pointers, structures, and object ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合里,例如那些需要其元素是对象的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是不可枚举的。
/* struct stu{ int a; int b; }stuTest = {4,5}; */ //结构体对象地址,把数据类型转换成c的字符串,表示数据类型 NSValue *value = [[NSValue alloc]initWithBytes:&stuTest objCType:@encode(struct stu) ]; if (strcmp(value.objCType, @encode(struct stu)) == 0) { NSLog(@"it's stu"); } //声明一个新的结构体 struct stu newStu; //把value的值给newStu [value getValue:&newStu]; NSLog(@"%d %d",newStu.a,newStu.b); char *p = (char *)0x1f; NSValue *value2 = [[NSValue alloc]initWithBytes:&p objCType:@encode(char *)]; char *q; [value getValue:&q]; NSLog(@"%p",q);
//NSValue包装指针 self.start = [NSValue valueWithPointer:@selector(one)]; NSValue* help = [NSValue valueWithPointer:@selector(two)]; [self performSelector:[self.start pointerValue] withObject:nil afterDelay:0]; CGPoint point = CGPointMake(10, 10); CGRect rect = CGRectMake(0, 0, 100, 100); CGSize size = CGSizeMake(20, 20); NSValue *rectValue = [NSValue valueWithCGRect:rect]; NSValue *sizeValue = [NSValue valueWithCGSize:size]; NSValue *rangeValue = [NSValue valueWithRange:NSMakeRange(0, 3)];