美文网首页
系列:iOS开发-NSArray

系列:iOS开发-NSArray

作者: spicyShrimp | 来源:发表于2017-09-20 15:50 被阅读131次

    系列:iOS开发-NSArray

    忙了一上午,解决了几个bug,现在终于抽出来一点时间喝点水休息下,
    想着系列这么浩大的一个工程,才刚刚开始写,不能断了,就跟写小说一样,既然是系列,那么就需要不停更...
    好吧.
    简单的说说iOS开发中的数组-NSArray

    首先
    OC的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
    类似于之前说的字符串一样,OC的数组也有两种,可变数组和不可变数组
    一步一步来,
    首先是NSArray的创建
    我们可以从NSArray的类里面看到很多类方法的创建和实例方法的创建

    @interface NSArray<ObjectType> (NSArrayCreation)
    
    + (instancetype)array;
    + (instancetype)arrayWithObject:(ObjectType)anObject;
    + (instancetype)arrayWithObjects:(const ObjectType [])objects count:(NSUInteger)cnt;
    + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    + (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;
    
    - (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array;
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
    
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
    - (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
    - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
    
    @end
    

    我们仿照着之前NSString的方式,随便列举一些例子看看,

            //init
            NSArray *arr1 = [[NSArray alloc]init];
            NSLog(@"%@",arr1);
            
            //array
            NSArray *arr2 = [NSArray array];
            NSLog(@"%@",arr2);
            
            //arrayWithObject
            NSArray *arr3 = [NSArray arrayWithObject:@"arr3"];
            NSLog(@"%@",arr3);
            
            //arrayWithObjects:
            NSArray *arr4 = [NSArray arrayWithObjects:@"arr4",@"arr4", nil];
            NSLog(@"%@",arr4);
            
            NSArray *arr5 = @[@"arr5",@"arr5",@"arr5",@"arr5",@"arr5"];
            NSLog(@"%@",arr5);
            
            //initWithObjects:
            NSArray *arr6 = [[NSArray alloc]initWithObjects:@"arr6",@"arr6", nil];
            NSLog(@"%@",arr6);
            
            //arrayWithArray:
            NSArray *arr7 = [NSArray arrayWithArray:arr6];
            NSLog(@"%@",arr7);
    

    当然创建的方式不单单这些,比如从文件里面读取数组,网络访问返回的数组...
    这些都在具体的例子中再对应创建...

    接下来再说说NSArray的一些常用方法.

            //常用方法
            //count  (读取数组元素个数)
            NSLog(@"%ld",[arr7 count]);
            
            //objectAtIndex:  (读取下标对应的元素,,,也可以用[]  C的方式直接读取)
            NSLog(@"%@,%@",[arr7 objectAtIndex:0],arr7[0]);
            
            //arrayByAddingObject:  (追加一个元素,返回新的数组)
            NSArray *arr8 = [arr7 arrayByAddingObject:@"arr8"];
            NSLog(@"%@",arr8);
            
            //arrayByAddingObjectsFromArray:   (追加多个元素,返回新的数组)
            NSArray *arr9 = [arr8 arrayByAddingObjectsFromArray:arr7];
            NSLog(@"%@",arr9);
            
            //componentsJoinedByString:   (使用某字符串合并数组元素成一个新的字符串)
            NSLog(@"%@",[arr9 componentsJoinedByString:@"-"]);
            
            //containsObject:  (数组中是否有某元素)
            NSLog(@"%d",[arr9 containsObject:@"arr9"]);
            
            //indexOfObject   (某元素对应的下标)
            NSLog(@"%ld",[arr9 indexOfObject:@"arr8"]);
            
            //indexOfObject:inRange:  (对应范围内的某元素的下标)
            NSLog(@"%ld",[arr9 indexOfObject:@"arr8" inRange:NSMakeRange(0, arr9.count)]);
            
            //isEqualToArray:    (两个数组是否相等)
            NSLog(@"%d",[arr9 isEqualToArray:arr8]);
            
            //firstObject  (第一个元素)
            NSLog(@"%@",[arr9 firstObject]);
            
            //lastObject  (最后一个元素)
            NSLog(@"%@",[arr9 lastObject]);
            
            //objectsAtIndexes  (对应的多个下标的多个元素)
            NSLog(@"%@",[arr9 objectsAtIndexes:[NSIndexSet indexSetWithIndex:1]]);
            
            //数组遍历
            //for循环
            for (int i = 0; i<arr9.count; i++) {
                NSLog(@"%@",arr9[i]);
            }
            
            //for in
            for (id obj in arr9) {
                NSLog(@"%@",obj);
            }
            
            //迭代器
            NSEnumerator *enumerator = [arr9 objectEnumerator];
            id obj = nil;
            while(obj = [enumerator nextObject]){
                NSLog(@"%@",obj);
            }
            
            //block
            [arr9 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                NSLog(@"%ld-%@",idx,obj);
                //若终断循环
                //*stop = YES;
            }];
    

    当然以上的方法都是一些基础的方法,经常会在项目中使用的方法..还有些不常用的和系统没有提供的需要在平时开发中再做积累,
    当然我刚刚也说了数组的遍历,上面也举例了几个,后期我会单独对其进行分析,比较各自的优缺点和性能.这里暂不描述

    接下来学习的是NSArray的子类 可变数组NSMutableArray
    还是类似的学习方式,创建+常用方法
    首先是创建

            //init
            NSMutableArray *arr10 = [[NSMutableArray alloc]init];
            NSLog(@"%@",arr10);
            
            //array
            NSMutableArray *arr11 = [NSMutableArray array];
            NSLog(@"%@",arr11);
            
            //arrayWithCapacity:  (创建初始长度为多少的数组,但因为其实可变数组,所以即使长度不够什么的,也没有关系,比如可以设0)
            NSMutableArray *arr12 = [NSMutableArray arrayWithCapacity:0];
            NSLog(@"%@",arr12);
            
            //initWithCapacity:
            NSMutableArray *arr13 = [[NSMutableArray alloc]initWithCapacity:0];
            NSLog(@"%@",arr13);
    

    当然因为其作为NSArray的子类,所以NSArray创建的方式,它也都有
    这里就不一一举例了

    常用方法:

            //addObject:  (添加一个元素)
            [arr13 addObject:@"arr13"];
            NSLog(@"%@",arr13);
            
            //addObjectsFromArray:   (添加一组元素)
            [arr13 addObjectsFromArray:arr9];
            NSLog(@"%@",arr13);
            
            //insertObject:atIndex  (在某下标插入某一个元素)
            [arr13 insertObject:@"arr" atIndex:0];
            NSLog(@"%@",arr13);
            
            //removeLastObject   (删除最后一个元素)
            [arr13 removeLastObject];
            NSLog(@"%@",arr13);
            
            //removeObjectAtIndex:  (删除某下标对应的元素)
            [arr13 removeObjectAtIndex:0];
            NSLog(@"%@",arr13);
            
            //replaceObjectAtIndex:withObject   (替换某下标的元素)
            [arr13 replaceObjectAtIndex:0 withObject:@"index"];
            NSLog(@"%@",arr13);
            
            //exchangeObjectAtIndex:withObjectAtIndex:   (替换两个下标对应元素)
            [arr13 exchangeObjectAtIndex:0 withObjectAtIndex:1];
            NSLog(@"%@",arr13);
            
            //removeAllObjects    (移除所有元素)
            [arr13 removeAllObjects];
            NSLog(@"%@",arr13);
            
            [arr13 addObjectsFromArray:arr9];
            
            //removeObject:inRange:  (移除某范围内指定元素)
            [arr13 removeObject:@"arr" inRange:NSMakeRange(0, 1)];
            NSLog(@"%@",arr13);
            
            //removeObject:   (移除指定元素)
            [arr13 removeObject:@"arr8"];
            NSLog(@"%@",arr13);
            
            //removeObjectsInArray:   (删除某数组内存在的元素)
            [arr13 removeObjectsInArray:arr7];
            NSLog(@"%@",arr13);
            
            //removeObjectsInRange:  (删除指定范围内的元素)
            [arr13 removeObjectsInRange:NSMakeRange(0, 1)];
            NSLog(@"%@",arr13);
            
            //setArray:   (设置数组元素)
            [arr13 setArray:arr9];
            
            //sortUsingSelector:  (排序)
            [arr13 sortUsingSelector:@selector(compare:)];
    

    当然还是一样的,凡是NSAarray的方法,NSMutableArray也都是支持的,方法很多有很多没有,需要在开发中自己积累,当然百度,谷歌...也都是方法的来源....
    常用方法基本就是这些,其实复杂的,特殊需求的方法绝大多数也是基于这些演变而来...

    至于上面也有说道排序,
    大家都学过C语言,肯定都能脱口而出冒泡\选择\插入...
    当然OC中也是有排序的方法的,sortUsingSelector: sortUsingComparator:等等,后续也会单独举例...

    今天就到这里..
    接下来讲的是key-value 也就是OC中的NSDictionary...
    我想大家也都知道了 可变,不可变.....

    Demo地址:https://github.com/spicyShrimp/DEMO_OC

    相关文章

      网友评论

          本文标题:系列:iOS开发-NSArray

          本文链接:https://www.haomeiwen.com/subject/kheosxtx.html