NSIndexSet,NSValue的学习记录

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]);

还可以使用NSIndexSet的indexesInRange:options:passingTest:方法来根据要求返回另一个NSIndexSet。操作过程和上面讲的enumerateIndexesInRange:options:usingBlock:方法类似,只不过Block参数需要返回一个BOOL,通过这个BOOL来决定元素是否被加入到返回的NSIndexSet对象中。


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);

参考文章:iOS: 小议NSIndexSet 

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)];


你可能感兴趣的:(ios,Object-C,NSValue,NSIndexSet)